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