Есть ли какой-либо официальный способ получить параметры администратора модели?

Мне нужно получить свойство search_fields, определенное в параметрах admin для модели. Давным-давно это было очень просто и прямо (но недокументировано), т.е. model._meta.admin.search_fields.

Доступ к администратору - это трудная часть, и ближайший я мог бы получить:

def admin_options(model):
    from django.contrib import admin
    return admin.site._registry.get(model)

Я не смог найти элемент ._registry, зарегистрированный (и подчеркивание, похоже, подразумевает, что он не является общедоступным). Это также не работает для сайтов, которые не запускали admin.autodiscover(). Резервный код делает это:

try:
    appname = model.__module__.split('.models')[0]
    admin_module = appname + '.admin'
    __import__(admin_module)  # registers admin option classes with AdminSite
except:
    return None
else:
   return admin.site._registry.get(model)

Есть ли официальный (или более простой) способ получить параметры администратора для модели?

Ответы

Ответ 1

сначала создать модель

from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from django.db import models
class LocationCode(models.Model):
    """
    A web service that will allow user to create there price rule based on conditions
    """
    name = models.CharField(max_length=255)
    code = models.CharField(max_length=255)

    def __unicode__(self):
        return self.name

в admin.py вам нужно добавить код

from django.contrib import admin
from dx_man.models import LocationCode 
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class LocationAdmin(admin.ModelAdmin):
    list_display=[]
    for x in LocationCode._meta.get_all_field_names():
        list_display.append(str(x))

admin.site.register(LocationCode, LocationAdmin)

в url.py добавьте эту строку

from django.contrib import admin
admin.autodiscover()

Ответ 2

Вам необходимо убедиться, что код регистрации запущен или сайт не будет содержать (model, modeladmin) в _registry.

code.py

from django.contrib.admin.sites import site

# run admin registration code before we get here
for model, model_admin in site._registry.items():
    if model == whatevermodel: 
        print(model_admin.search_fields)