Django использует метод __init__ в расширении классов (admin.ModelAdmin) - PullRequest
0 голосов
/ 07 ноября 2019

Я довольно новичок в Django.

У меня есть admin.Models расширенный класс, который довольно типичен (имеет list_display, search_fields и т. Д.).

Это выглядит примерно такэто:

class FooAdmin(admin.ModelAdmin):
    list_display = (
        'all',
        'my',
        'things',
    )
    ...
admin.site.register(Foo, FooAdmin)

Моя проблема в том, что этот ModelAdmin загружает что-то из модели с чем-то вроде foo_list = Foo.objects.filter(group__name='something').

Поскольку это тяжелая задача, я бы хотел выполнитьэто один раз при инициализации, а затем снова и снова использовать одно и то же при указании пользовательских "_field" функций.

Я думаю сделать это в методе __init__ этого класса, но при реализации моего собственного конструктора он не регистрируется в Django как URL;т. е.

class FooAdmin(admin.ModelAdmin):
    def __init__(self, *args, **kwargs):
        super(Foo, self).__init__(*args, **kwargs)
    list_display = (
        'all',
        'my',
        'things',
    )
    ...
# This register portion removed.
# admin.site.register(Foo, FooAdmin)

Вышеуказанное будет "правильно" скомпилировано и запущено, но попытка посетить сайт говорит, что URL не найден (неудивительно, так как я удалил часть регистра).

ОднакоКогда я снова добавляю часть регистра, я получаю сообщение о неправильном использовании моего конструктора, то есть добавление admin.site.register и выполнение python manage.py runserver ... приводит к чему-то вроде:

TypeError: super(type, obj): obj must be an instance or subtype of type

У меня естьвзяла этот конструктор из множественных примеров до нет без , поэтому я не уверен, что этоВерсии версий Django или нет.

Мои вопросы:

  1. Как я могу использовать метод инициализации или что-то вроде «жизненного цикла»в admin.ModelAdmin расширенном классе?
  2. Почему реализованный мой конструктор нарушает интерфейс конструкторов при регистрации URL?

Это моя среда:

$ python
Python 3.7.4 (default, Sep  7 2019, 18:29:04)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.VERSION
(2, 2, 5, 'final', 0)
...