如何按字母顺序排序Django管理员中的下拉列表?

时间:2013-09-11 13:30:49

标签: python django sorting

这是我的模型的(非常)简化版本:

实验室/ models.py

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

作者/ models.py

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

在Django管理员中,当我添加或更新实验室时,会自动生成并显示包含每位教授的下拉列表。问题是这个列表很长,并没有按字母顺序排列。我希望教授下拉列表按“名称”字段按字母顺序排列。

我该怎么做?

4 个答案:

答案 0 :(得分:17)

您可以为作者模型定义默认顺序:

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

    class Meta:
        ordering = ('name',)

答案 1 :(得分:10)

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列,在这种情况下,您可能必须使用其他列索引排序列。

答案 2 :(得分:0)

好吧,您可以在django admin中使用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)

答案 3 :(得分:0)

当前执行此操作的方法(2019年1月):

在您的admin.py文件中:

class AuthorAdmin(admin.ModelAdmin):
    ordering = ['name']

然后注册:

admin.site.register(Author, AuthorAdmin)

如文档中所述: https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.ordering