我可以在 Django 管理面板中禁用默认排序吗?

问题描述 投票:0回答:1

我正在尝试使用“liczba_glosow”字段在 Django 管理面板中进行排序。问题在于模型本身在 Meta 方法中按“numer_na_liscie”排序,而管理员使用默认排序而不是“liczba_glosow”。我希望管理员仅使用 order_by("-_liczba_glosow") 并绕过默认值。我无法使用简单的 ordering="liczba_glosow" 因为该字段只是为了管理显示目的而创建的,它不是模型本身的一部分。

class KandydatDoSejmuAdmin(admin.ModelAdmin):
    list_display = ("imie_nazwisko", "numer_na_liscie", "okreg_wyborczy", "komitet_wyborczy", "liczba_glosow")
    raw_id_fields = ("okreg_wyborczy", "komitet_wyborczy")
    list_filter = ("komitet_wyborczy__nazwa", "oddanyglos__kod_pocztowy__wojewodztwo", "okreg_wyborczy__nazwa",)
    search_fields = (
        "imie_nazwisko", "okreg_wyborczy__nazwa", "komitet_wyborczy__nazwa", "oddanyglos__kod_pocztowy__wojewodztwo")
    list_per_page = 10

    def liczba_glosow(self, obj):
        return obj.oddanyglos_set.count()

    liczba_glosow.admin_order_field = "_liczba_glosow"

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.annotate(
            _liczba_glosow=Count("oddanyglos__kandydat")
        ).order_by("-_liczba_glosow")  

根据 Django 文档:

设置排序以指定对象列表在 Django 管理视图中的排序方式。这应该是与模型排序参数格式相同的列表或元组。 如果未提供,Django 管理员将使用模型的默认排序。

根据上述规定,任何禁用默认排序(如 ordering=None、get_ordering() 返回 None 或空列表)的尝试都不起作用。

是否有一个选项可以覆盖管理面板中的默认排序而不干扰模型?我需要在应用程序的其他部分对模型进行默认排序,所以我宁愿保留它。

django sorting model admin
1个回答
0
投票

您可以将其设置为您的自定义订单:

class KandydatDoSejmuAdmin(admin.ModelAdmin):
    list_display = (
        'imie_nazwisko',
        'numer_na_liscie',
        'okreg_wyborczy',
        'komitet_wyborczy',
        'liczba_glosow',
    )
    raw_id_fields = ('okreg_wyborczy', 'komitet_wyborczy')
    list_filter = (
        'komitet_wyborczy__nazwa',
        'oddanyglos__kod_pocztowy__wojewodztwo',
        'okreg_wyborczy__nazwa',
    )
    search_fields = (
        'imie_nazwisko',
        'okreg_wyborczy__nazwa',
        'komitet_wyborczy__nazwa',
        'oddanyglos__kod_pocztowy__wojewodztwo',
    )
    list_per_page = 10
    ordering = '-_liczba_glosow'

    def liczba_glosow(self, obj):
        return obj.oddanyglos_set.count()

    liczba_glosow.admin_order_field = '_liczba_glosow'

    def get_queryset(self, request):
        return (
            super()
            .get_queryset(request)
            .annotate(_liczba_glosow=Count('oddanyglos__kandydat'))
        )

因此,我们在

get_queryset
中注入一个表达式,然后使用
.ordering
 [Django-doc]
将其用作排序。

© www.soinside.com 2019 - 2024. All rights reserved.