2013-09-11 3 views
8

Вот (очень) упрощенная версия моей модели:Как в алфавитном порядке выбрать раскрывающийся список в администраторе Django?

лаборатория/models.py

class Lab(Model): 
    professor = ForeignKey('authors.Author') 

авторы/models.py

class Author(Model): 
    name = CharField(max_length=100) 

В админке Django, когда я добавляю или обновляю Лабораторию, выпадающий список, содержащий каждого профессора, автоматически генерируется и отображается. Проблема в том, что этот список очень длинный, и он не упорядочен по алфавиту. Я хочу, чтобы раскрывающийся список профессора был упорядочен по алфавиту по полю «имя».

Как я могу это сделать?

+0

См. Http://stackoverflow.com/questions/8992865/django-admin-sort-foreign-key-field-list – alecxe

ответ

15

Вы можете определить порядок по умолчанию для модели Автор:

class Author(Model): 
    name = CharField(max_length=100) 

    class Meta: 
     ordering = ('name',) 
0

Ну, вы можете использовать переменную ordering в Джанго администратора, или вы можете использовать order_with_respect_to underneath class Meta. Итак, сначала вам нужно добавить файл admin.py в тот же каталог, что и ваш файл models.py. Это то, что ваш файл admin.py должен выглядеть следующим образом:

from django.contrib import admin 

from models import Lab 

class LabAdmin(admin.ModelAdmin): 
    fields = ('name',) 

    class Meta: 
     ordering = ['name'] # ['-name'] if you want the opposite ordering 


admin.site.register(Lab, LabAdmin) 
+0

Это не сработает - опция 'Meta'' ordering', которую вы описываете, работает только на самой модели, а не на классе ModelAdmin. – YPCrumble

+0

«заказ» для ModelAdmin должен быть помещен под самим классом, а не под Meta. – Xerion

4

ModelAdmin specific ordering via formfield_for_foreignkey

class MyModelAdmin(admin.ModelAdmin): 
    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == "author": 
      kwargs["queryset"] = Author.objects.filter(anyfilters=anyfilters).order_by('name') 
     return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

Примечание ИМХО его лучше не устанавливать порядок на model, потому что порядок вашей страницы администратора должно быть отделено от модель.

Также все запросы, запущенные на модели, будут использовать столбец order_by, и в этом случае вам может потребоваться индексировать столбец заказа с другими столбцами.

+1

Я согласен с @ ravi404. Приятно иметь возможность упорядочивать отдельные, если в моделях они должны быть разными. Возможно, чем admin.py. Этот ответ сработал для меня. Я изменил запрос, чтобы включить упорядочение; что-то вроде: 'kwargs ['queryset'] = Car.objects.all(). order_by ('make')'. –

Смежные вопросы