我希望能够在模型中定义一个属性,该属性也可以使用“list_display”Admin属性中的admin_order_field显示和排序。下面是我想要定义的属性的代码(并且可以在django管理界面中进行排序)
@property
def restaurant_name(self):
return str(self.restaurant)
restaurant_name.admin_order_field = 'restaurant__name'
但是,我收到以下错误消息:
AttributeError: 'property' object has no attribute 'admin_order_field'
当我摆脱@property装饰器时,它工作正常,但是我必须在模型实例上调用restaurant_name()而不是restaurant_name,它在如何访问模型的不同属性时提供不一致的样式(这是实际上定义为Python属性)。如何在管理员中将Python属性指定为可排序?
答案 0 :(得分:5)
您无法为属性分配属性,就像错误消息告诉您的那样。您有两个选择 - 删除@property装饰器,或提供只有管理员使用的包装器。
@property
def restaurant_name(self):
return str(self.restaurant)
def restaurant_name_admin(self):
return self.restaurant_name
restaurant_name_admin.admin_order_field = 'restaurant__name'
答案 1 :(得分:1)
与Josh的答案类似,但对我来说有点漂亮和有用,因为这种方式也允许你short_description
指定:
def _restaurant_name(self):
return str(self.restaurant)
_restaurant_name.short_description = ugettext_lazy("restaurant name")
_restaurant_name.admin_order_field = 'restaurant__name'
restaurant_name = property(_restaurant_name)
现在,您可以将_restaurant_name
用作admin changelist_view中的callable,将restaurant_name
用作其他任何位置的属性。