Как в алфавитном порядке заказать выпадающий список в Django admin?
вот (очень) упрощенная версия моих моделей:
laboratory/models.py
class Lab(Model):
    professor = ForeignKey('authors.Author')
authors/models.py
class Author(Model):
    name = CharField(max_length=100)
в Администраторе Django, когда я добавляю или обновляю лабораторию, раскрывающийся список, содержащий каждого профессора, автоматически генерируется и отображается. Проблема в том, что этот список очень длинный и не упорядочен по алфавиту. Я хочу, чтобы выпадающий список профессора был в алфавитном порядке упорядочен по " имени" поле.
Как я могу это сделать?
3 ответов
вы можете определить порядок по умолчанию для модели автора:
class Author(Model):
    name = CharField(max_length=100)
    class Meta:
        ordering = ('name',)
ModelAdmin конкретный заказ через 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 столбец, в этом случае вам, возможно, придется индексировать столбец заказа с другими столбцами.
Ну, вы можете использовать ordering переменная в Django admin, или вы можете использовать order_with_respect_to под class Meta. Итак, сначала вам нужно добавить admin.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)
