为什么@property模型定义在Django Admin的list_display中可见,而在field_sets中不可见?

时间:2020-01-05 02:03:48

标签: django django-models django-admin

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

1 个答案:

答案 0 :(得分: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
    ]