10

我希望能够在模型中定义一个属性,该属性也可以使用“list_display”管理属性中的 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 属性指定为可排序?

4

2 回答 2

9

您不能将属性分配给属性,就像错误消息告诉您的那样。您有两个选择 - 删除 @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'
于 2013-06-24T04:26:55.543 回答
4

与 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 中用作可调用对象,也可以restaurant_name在其他任何地方用作属性。

于 2015-06-17T15:05:06.790 回答