如何创建Admin系统可以排序的__unicode__字段?

时间:2013-11-26 00:47:23

标签: python django sorting unicode

我正在使用Django来运行一个小病人名单。在管理界面中,我有一些在admin.py文件中定义的列。

class InpatientAdmin(admin.ModelAdmin):
list_filter = ['discharged','date_of_admission']
date_hierarchy = 'date_of_admission'
list_display = ('room', '__unicode__', 'date_of_admission', 'date_of_discharge', 'discharged')
inlines = [ EncounterInline ]

unicode字段在模型中定义为

    def __unicode__(self):
    return '%s, %s %s' % (self.last_name, self.first_name, self.DOB)

管理界面有效。 Django程序员做的很棒。但是,当我单击unicode定义字段的标题时,它将不会排序。我可以对Room,date_of_admission和date_of_discharge进行排序,但unicode字段不会排序。我尝试在unicode def中返回self.last_name,但这也没有用。我怀疑unicode字段没有提供钩回比较例程。

我确信有一些简单的工作要做,但我不知道google用于查找解决方案的条款。帮助赞赏。

谢谢, 史蒂夫

2 个答案:

答案 0 :(得分:2)

试图使用Peter DeGlopper的答案,但有几个问题,该片段应该放在models.py中,但模型中没有定义self

因此,

self.__unicode__.admin_order_field = 'last_name'

没有工作。

即使您尝试:

__unicode__.admin_order_field = 'last_name'

管理员很顽固,不想排序。因此,我找到了this solution。那就是创建一个模型方法,只返回unicode名称,然后定义排序字段。

同样,不是我的解决方案(代码来自链接),但它应该帮助其他人面临同样的问题:

<强> models.py

def unicode_sort(self):
    return self.__unicode__()

unicode_sort.admin_order_field = 'sort'
unicode_sort.short_description = u'name'

<强> admin.py

list_display = ('unicode_sort',) 

答案 1 :(得分:0)

如果您想按单个字段排序(例如last_name),可以将其设置为admin_order_field方法的__unicode__。不支持通过可调用字段进行更复杂的排序。

https://docs.djangoproject.com/en/dev/ref/contrib/admin/

  

通常,list_display的元素不是实际的数据库字段,不能用于排序(因为Django在数据库级别进行所有排序)。

     

但是,如果list_display的元素代表某个数据库字段,您可以通过设置该项的admin_order_field属性来指明这一事实。

所以这应该有效,只要逻辑是你想要的:

def __unicode__(self):
    return '%s, %s %s' % (self.last_name, self.first_name, self.DOB)
self.__unicode__.admin_order_field = 'last_name'