【问题标题】:Django admin change list view disable sorting for some fieldsDjango 管理员更改列表视图禁用某些字段的排序
【发布时间】:2015-09-04 21:18:48
【问题描述】:

是否有办法禁用 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 对列表进行排序。

有人有建议吗?谢谢。

【问题讨论】:

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


    【解决方案1】:

    对于 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不知道如何排序(或处理)该方法的返回结果。

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

    额外:如果你想让模型方法可排序,你必须传递admin_order_field值,比如:

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

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

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

    【讨论】:

    • 谢谢。我想我只有这样才能做到。