Как в алфавитном порядке заказать выпадающий список в 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)