28

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

实验室/models.py

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

作者/models.py

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

在 Django admin 中,当我添加或更新 Lab 时,会自动生成并显示一个包含每个教授的下拉列表。问题是这个列表很长,而且不是按字母顺序排列的。我希望教授下拉列表按“姓名”字段的字母顺序排列。

我怎样才能做到这一点?

4

4 回答 4

24

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

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

    class Meta:
        ordering = ('name',)

请记住,这会导致 Django 中的对象也被排序,并且必须完成迁移。

您可以ordering = ['name']在 AuthorAdmin 文件下为管理仪表板订购。

于 2013-09-11T13:35:23.437 回答
21

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

于 2015-11-02T10:01:40.080 回答
5

当前执行此操作的方法(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

于 2019-01-05T17:56:22.397 回答
-1

好吧,您可以ordering在 django admin 中使用该变量,也可以order_with_respect_to在下面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)
于 2013-09-11T13:36:56.190 回答