Django管理界面按字母顺序排序

4

我正在使用Django-admin,并且有以下模型。它在管理员中显示为下拉列表。如何按字母顺序排序?而不是默认的用户ID?

user= models.ForeignKey(User)
6个回答

4
根据Django核心开发人员的说法,您描述的问题是一种功能而不是错误。起初,Django按字母顺序排序“用户”字段,但这会导致在有数十万用户的“真正大型”网站(当时主要是Pownce)中出现性能问题。但是,为了不让少数“巨大”的Django网站实施解决方法,排序被简单地移除,现在每个具有对“用户”具有ForeignKey模型的站点都存在可用性问题。
我大约一年前在Django问题跟踪器上发布了一个丑陋的解决方法。Daniel Roseman在另一个Stackoverflow问题中发表了类似(并且我认为更好的)解决方案。

你知道类型对象“CollaboratorForm”没有属性“fields”吗? - Grey

2
为什么不在层级模型中进行?
class Meta:
    ordering = ['field',]

还是在管理员级别进行操作?
class Admin:
    ordering       = ('field',)

仅仅因为它是django.contrib,所以你不应该这样修改它。你可以这样做,但是为单个项目修改库并不是一个好主意。 - Jerzyk
抱歉?我不是在谈论修改任何库。我在考虑文档中提到的代理模型:“标准用户模型没有定义排序(故意的;排序很昂贵,我们不想每次获取用户时都进行排序)。当您使用代理时,您可能希望经常按用户名属性排序...” - inigomedina
但是,你会在不同的命名空间中拥有不同的模型。因此,你的外键将指向一个不同的模型。 - Jerzyk
是的,针对代理模型。清楚明了,不是吗?无论如何,与您的第一条评论无关。 - inigomedina

0
如果你不仅有5个用户,而是有相当数量的用户,那么将管理员界面改为使用raw_id_fields来选择用户可能是有意义的。这样一来,用户将在自己的列表视图中显示,可以进行筛选和排序。
class MyAdmin(ModelAdmin):
    raw_id_fields = ['user']

0

为您的模型创建一个自定义表单并将其分配给您的ModelAdmin子类--您可以在表单的__init__中覆盖ModelChoiceField的排序。例如:

# models.py
from django.db import models
from django.contrib.auth.models import User

class MyModel(models.Model):
    user = models.ForeignKey(User)
    # Other model fields ...

# forms.py
from django import forms
from django.contrib.auth.models import User
from myapp.models import MyModel

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel

    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)
        self.fields['user'].queryset = User.objects.order_by('first_name', 'last_name')

# admin.py
from django.contrib import admin
from myapp.models import MyModel
from myapp.forms import MyModelForm

class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm
    # Other admin attributes ...

admin.site.register(MyModel, MyModelForm)

你知道为什么我总是得到“类型对象'CollaboratorForm'没有属性'fields'”的错误吗? - Grey

0

0

您可以在相关的Admin类中轻松排序admin.py

假设您的Admin类如下:

@admin.register(UserStuff)
class UserStuffAdmin(admin.ModelAdmin):
    list_display = ['user', 'other', 'fields']
    ordering = ['user']

这行代码 ordering = ['user'] 将按照 user 字段排序。根据字段的字母或数字顺序进行排序。使用字段的正常排序方法。您还可以执行 ordering = ['-user'],它将按降序排序。

来源:https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.ordering


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接