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

17 python sorting django

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

实验室/ models.py

class Lab(Model):
    professor = ForeignKey('authors.Author')
Run Code Online (Sandbox Code Playgroud)

作者/ models.py

class Author(Model):
    name = CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?

ipe*_*kiy 16

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

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

    class Meta:
        ordering = ('name',)
Run Code Online (Sandbox Code Playgroud)

  • 这不是问题,并且有不良副作用.这意味着对象总是*有序,而不仅仅是在管理面板中. (7认同)

rav*_*404 12

通过formfield_for_foreignkey对ModelAdmin进行特定排序

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)
Run Code Online (Sandbox Code Playgroud)

注意恕我直言,最好不要设置顺序,model因为管理页面的顺序需要与模型分离.

此外,在模型上触发的所有查询都将使用该order_by列,在这种情况下,您可能必须使用其他列索引排序列.

  • 我同意@ ravi404.很高兴能够保持单独订购,以防它在models.py中需要与admin.py不同.这个答案对我有用.我更改了查询集以包含排序; 类似于:`kwargs ['queryset'] = Car.objects.all().order_by('make')`. (4认同)

ari*_*ris 5

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

在您的 admin.py 文件中:

class AuthorAdmin(admin.ModelAdmin):
    ordering = ['name']
Run Code Online (Sandbox Code Playgroud)

然后注册它:

admin.site.register(Author, AuthorAdmin)
Run Code Online (Sandbox Code Playgroud)

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