我对 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;IE
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 版本控制的事情。
我的问题是:
- 如何在
admin.ModelAdmin
扩展类中使用初始化方法或某种“生命周期挂钩”? - 为什么在注册 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)