2015-06-19 4 views
1

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

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

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) 

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

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

ответ

0

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

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

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

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

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

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

Спасибо. Я думаю, что у меня есть такой способ сделать это. – Pang