有没有办法始终按 django-tables2 中的特定列订购 table?

Is there a way to always order a table by a specific column in django-tables2?

我正在使用 django-tables2 渲染 MyModel 的 table。 MyModelcategory 字段指定了几个不同的类别。我希望能够覆盖 order_by,以便 table 的主要顺序始终是 category,而选择的任何其他内容都只是次要顺序。关于如何执行此操作有什么建议吗?

晚到forum.I还没有尝试过下面这个方法。但我认为这可能会有所帮助。在 tables.py 中创建一个 table。并像往常一样将 table 添加到您的视图中。添加 table 后,您可以尝试 order_by,它在 django-tables2.

中受支持
**tables.py**

import django_tables2 as tables
from .models import Person

class PersonTable(tables.Table):
    class Meta:
        model = Person
        template_name = 'django_tables2/bootstrap.html'

**views.py**
from django.shortcuts import render
from django_tables2 import RequestConfig
from .tables import PersonTable

def people_listing(request):
    config = RequestConfig(request)
    table = PersonTable(Person.objects.all())
    table.order_by = 'name'
    return render(request, 'data/person.html', {'table': table})

对于遇到此问题的其他人,我最终得到了答案:

class PersonTable(tables.Table):
    def __init__(self, *args, **kwargs):
        def generate_order_func(field_name: str) -> Callable:
            # django-tables2 stamps any secondary ordering if you have a custom ordering function on any of your
            # ordering fields. This adds custom ordering to every field so that name is always the primary
            # ordering 

            def order_func(qs: QuerySet, descending: bool) -> Tuple[QuerySet, bool]:
                # Need custom ordering on deal_state (not alphabetical)
                qs = qs.order_by("name", ("-" if descending else "") + field_name)
                return qs, True

            return order_func

        for field in self._meta.fields:
            setattr(self, f"order_{field}", generate_order_func(field))

        super().__init__(*args, **kwargs)

这会覆盖每个字段的排序,使其首先按主排序排序。