如何关闭 Django-admin 表中的列排序或指定哪些列可排序?

Tro*_*roy 4 django django-admin

是否有一种简单的方法可以关闭 django 管理中某些/所有列的可排序性和/或指定哪些列是可排序的?

我知道我可以通过 javascript 手动禁用排序,但这有点 hacky,我希望有更好的或内置的方式。

我正在尝试实现类似于以下管理列表的拖放排序:http : //djangosnippets.org/snippets/2870/,但如果表按其他排序,则拖放排序没有意义- 比位置列。我这样做的表永远不会是一个大表,因此用户没有理由需要按位置列以外的其他方式排序,并且允许它按另一列排序只会增加混乱。

Cod*_*ink 5

对于那些来这里寻找除上述规定之外的其他解决方案的人,如果您Admin Model ClassModelAdmin或的子类admin.ModelAdmin,则可以引用一个子类变量来过滤掉或指示可以选择哪些字段对列中的数据进行排序。

这是文档链接。

但这是到目前为止的内容。

ModelAdmin.sortable_by
默认情况下,更改列表页面允许按 list_display 中指定的所有模型字段(以及具有 admin_order_field 属性的可调用项)进行排序。

如果要对某些列禁用排序,请将 sortable_by 设置为要排序的 list_display 子集的集合(例如列表、元组或集合)。空集合禁用所有列的排序。
如果您需要动态指定此列表,请改用 get_sortable_by() 方法。

应用

  • 例如,associateId由于各种原因,我们不想提供排序。避免对特定字段进行排序。只需排除该字段并重新声明其他字段。
class AssociateAttributeFields(ModelAdmin):
    list_display = (
        "associateId",
        "isAllowed",
        "staffRole",
        "dtCreated",
    )
    sortable_by = (
        "isAllowed",
        "staffRole",
        "dtCreated",
    )
    # Can also be the following to avoid being redundant...
    # sortable_by = list_display[1:]
Run Code Online (Sandbox Code Playgroud)

输出 为清楚起见。 演示


Pet*_*per 2

我认为没有一种优雅的方法可以做到这一点。

您可以通过使用自定义 ChangeList 并重写该方法来在后端将其关闭,get_ordering_field以便为您不希望可排序的字段返回 None 。我还没有测试过,但看起来如果在该字段上排序的请求最终出现在请求中,管理员就会忽略它们。然后,您可以覆盖change_list_results.html呈现表头的模板或使用一些 JS 删除 CSS/Javascript 部分。

或者,您可以在模型或管理类上创建方法来隐藏您不希望可排序的列,不设置其 admin_order_field 值,并仅使用list_display. 这不需要对内置管理进行太多更改,但这有点荒谬。