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

Django admin change list view disable sorting for some fields

是否有办法禁用 django 管理更改列表中某些字段的排序功能,以便用户无法单击 header 列对列表进行排序。

我试过下面的方法,还是不行。

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 对列表进行排序。

有人有什么建议吗?谢谢

对于Django 1.7(或者我上次使用的版本)不支持这样的东西。一种可能的变通方法是定义模型 class 方法并使用该方法代替模型字段。

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 是模型 class 方法,django 不知道如何排序(或处理)该方法的 return 结果。

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

额外:如果你想使模型方法 sortable,你必须传递 admin_order_field 值,如:

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

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

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