【问题标题】:Why are @property model definitions visible in list_display but not field_sets for Django Admin?为什么 @property 模型定义在 list_display 中可见,但在 Django Admin 的 field_sets 中不可见?
【发布时间】:2020-01-05 02:03:48
【问题描述】:

为什么 list_display 中的 @property 定义可见,但对于 Django Admin 而不是 field_setslist_filter

例如。在下面的示例中,my_prop 在管理员中完美显示为 list_display 字段,但不是 field_set 中的字段

models.py:

class MyModel (models.Model):
       // code

     @property my_prop(self):
       // code

admin.py:

@admin.register(MyModel):
    class MyModelAdmin(AdminModel):
        list_display=('my_prop',)
        fieldsets = ( ('Summary',{ 'fields':('myprop',) }))

编辑

感谢Iain Shelvington,他解释说@property 在Django Admin 中显示为readonly_field 要求。

进一步更新了一个真实世界的例子,说明在我的例子中@property 是如何构建的。欢迎提出关于如何过滤这个等同于 Django Admin 中的 list_filter 字段的想法!

closure_datetime = models.DateTimeField()

@property
def my_prop(self):
    if self.closure_datetime :
        return True
    else:
        return False

【问题讨论】:

  • 您需要将myprop添加到MyModelAdmin.readonly_fields - docs.djangoproject.com/en/3.0/ref/contrib/admin/…
  • 谢谢,这似乎适用于我对list_display 的测试,但奇怪的是不适用于list_filter。你知道为什么会这样吗?
  • list_filter 通常用于可以通过查询过滤的模型字段。如果您举例说明如何生成my_prop,也许我可以建议一种过滤它的方法
  • closure_datetime 必须可以为空?否则my_prop 将始终返回True

标签: django django-models django-admin


【解决方案1】:

如果您希望它们显示在管理员编辑页面上,您必须将非字段(如属性)添加到 readonly_fields

要添加基于closure_datetime 是否为空的过滤器,您可以定义这样的过滤器

class MyPropListFilter(admin.SimpleListFilter):
    title = 'My Prop'
    parameter_name = 'my_prop'

    def lookups(self, request, model_admin):
        return (
            ('true', 'True'),
            ('false', 'False'),
        )

    def queryset(self, request, queryset):
        if self.value() == 'true':
            return queryset.filter(closure_datetime__isnull=False)
        if self.value() == 'false':
            return queryset.filter(closure_datetime__isnull=True)

并像这样将其添加到您的管理员中

class MyModelAdmin(AdminModel):
    list_filter = [
        MyPropListFilter
    ]

【讨论】:

    猜你喜欢
    • 2015-04-02
    • 2019-03-25
    • 1970-01-01
    • 2021-11-17
    • 2021-03-26
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    相关资源
    最近更新 更多