我有一个 Django 站点,使用 admin 来管理模型。目前我正在使用
from django.db.models.base import ModelBase
for name, var in databuild_models.__dict__.items():
if type(var) is ModelBase:
admin.site.register(var)
使用管理模块注册模块中的所有模型。但是,我想自动为每个模型上的每个属性添加 list_filters 。我读过https://docs.djangoproject.com/en/1.8/ref/contrib/admin/他们使用以下形式:
class MymodelAdmin(admin.ModelAdmin):
list_filter = ['model_name_attribute']
然后
admin.site.register(models.MyModel, MyModelAdmin)
是否有一种方法可以类似地循环访问模型中的每个属性,并将其添加到过滤器列表中?
例如:
filter_list_fields = []
for attr in MyModel:
filter_list_fields.append(str(attr))
list_filter = filter_list_fields
然后将它们注册为普通类?
最佳答案
首先,您可以使用applications api获取应用程序中的模型列表,而不是检查模块的 __dict__
在 Django 1.8+ 中,您可以使用 Model._meta.get_fields
获取模型的字段名称列表。方法。我已排除自动生成的 id
字段,您可能会发现需要进行进一步改进。
在Python中,您可以使用type
动态创建类。 。您需要新类的名称(此处并不重要)、它继承的基类(在本例中为 Admin.ModelAdmin )以及属性字典(在本例中只有一个属性,list_filter
)。
最后,向我们创建的自定义模型管理员注册模型。
把它们放在一起,你的 admin.py 应该看起来像这样:
from django.contrib import admin
from django.apps import apps
app_config = apps.get_app_config('myapp')
models = app_config.get_models()
for Model in models:
fieldnames = [f.name for f in Model._meta.get_fields() if f.name != 'id']
ModelAdmin = type('ModelAdmin', (admin.ModelAdmin,), {'list_filter': fieldnames})
admin.site.register(Model, ModelAdmin)
关于python - 如何在 django 管理页面中自动为我的所有模型创建 list_filters?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29880154/