AttributeError:'property'对象没有属性'admin_order_field'

时间:2013-06-24 03:55:01

标签: django django-admin

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

2 个答案:

答案 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用作其他任何位置的属性。