为什么 @属性 模型定义在 list_display 中可见,但在 Django Admin 中不可见 field_sets?

Why are @property model definitions visible in list_display but not field_sets for Django Admin?

为什么 @property 定义在 list_display 中可见,但在 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

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

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

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
    ]