Django管理员更改列表视图禁用某些字段的排序

时间:2015-06-19 02:12:09

标签: python django python-2.7 django-admin django-1.7

是否有方法可以禁用django管理员更改列表中某些字段的排序功能,因此对于这些字段,用户无法单击列标题对列表进行排序。

我尝试了以下方法,但它不起作用。

https://djangosnippets.org/snippets/2580/

我也厌倦了在ModelAdmin中覆盖changelist_view但也没有发生任何事情。

def changelist_view(self, request, extra_context=None):
    self.ordering_fields = ['id']
    return super(MyModelAdmin, self).changelist_view(request, extra_context)

在上述情况下,我想只允许用户按ID排序列表。

有人有什么建议吗?感谢。

1 个答案:

答案 0 :(得分:0)

对于Django 1.7(或我上次使用的版本)不支持此类内容。一种可能的肮脏解决方法是定义模型类方法并使用该方法而不是模型字段。

class TestClass(Model):
    some_field = (.....)
    other_field = (........)

    def show_other_field(self):
        return self.other_field

class TestClassAdmin(ModelAdmin):
     list_display = ("some_field", "show_other_field")

由于show_other_field是一个模型类方法,因此django不知道如何对该方法的返回结果进行排序(或处理)。

但正如我所说,根据用例,这可能需要更多处理(可能需要更多数据库调用),而不是显示模型的字段。

额外:如果您想制作模型方法可排序,则必须传递admin_order_field值,如:

def show_other_field(self):
    return self.other_field
show_other_field.admin_order_field = "other_field"

这将使您的模型方法可排序在admin list_display中。但是你必须传递一个在数据库api的order_by方法中可用的字段或关系。

TestClass.objects.filter(....).order_by(<admin_order_field>)