python - 如何在 django 管理页面中自动为我的所有模型创建 list_filters?

标签 python django django-admin django-admin-filters

我有一个 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/

相关文章:

python - 在 Python argparse 中,是否可以配对 --no-something/--something 参数?

python - 你如何在cygwin下编译wxPython?

Python 和 PyQt4 : setMenu method not working on a pushButton object

python - DRF - 具有非模型 write_only 字段的 ModelSerializer

python - 浏览器在 django 管理(缓存,python/django)中更改页面内容时出现延迟

python - Django Admin 将我的外键显示为中间模型作为文本输入

python - 标记出现在pycharm中不起作用

python - django模板在哪里

python - Django的manage.py测试: “database backend does not accept 0 as a value for AutoField” (mysql)

python - Django 1.5 扩展 admin/change_form.html 对象工具