Просмотр списка изменений администратора Django отключить сортировку для некоторых полей

Есть ли способ отключить функцию сортировки для некоторых полей в списке изменений администратора django, чтобы для этих полей пользователи не могли щелкнуть заголовок столбца, чтобы отсортировать список.

Я попробовал следующий метод, но он не работает.

https://djangosnippets.org/snippets/2580/

Я также устал переопределять changelist_view в ModelAdmin, но тоже ничего не происходит.

def changelist_view(self, request, extra_context=None):
    self.ordering_fields = ['id']
    return super(MyModelAdmin, self).changelist_view(request, extra_context)

В приведенном выше случае я хотел бы разрешить пользователю сортировать список только по идентификатору.

У кого-нибудь есть предложение? Спасибо.


person Pang    schedule 19.06.2015    source источник


Ответы (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 не знает, как сортировать (или обрабатывать) возвращаемый результат этого метода.

Но, как я уже сказал, это грязный хак, который может потребовать больше обработки (и, возможно, больше вызовов базы данных) в зависимости от варианта использования, чем отображение поля модели.

Дополнительно: если вы хотите сделать метод модели сортируемым, вы должны передать значение admin_order_field, например:

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

Это сделает ваш метод модели сортируемым в admin list_display. Но вы должны передать поле или отношение, которое можно использовать в методе order_by API базы данных.

TestClass.objects.filter(....).order_by(<admin_order_field>)
person FallenAngel    schedule 19.06.2015
comment
Спасибо. Я думаю, что у меня есть только этот способ сделать это. - person Pang; 07.07.2015