Django Admin:外键和多对多字段中用户的排序问题

24 投票
4 回答
24431 浏览
提问于 2025-04-15 14:35

我有一个应用程序,它使用Django的UserProfile来扩展内置的Django User模型。看起来像这样:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    # Local Stuff
    image_url_s = models.CharField(max_length=128, blank=True)
    image_url_m = models.CharField(max_length=128, blank=True)

    # Admin
    class Admin: pass

我在我的模型中添加了一个新类:

class Team(models.Model):
    name = models.CharField(max_length=128)
    manager = models.ForeignKey(User, related_name='manager')
    members = models.ManyToManyField(User, blank=True)

并且它已经注册到管理员界面中:

class TeamAdmin(admin.ModelAdmin):
    list_display = ('name', 'manager')

admin.site.register(Team, TeamAdmin)

可惜的是,在管理员界面中,当我想从下拉框中选择一个经理,或者通过多选框设置团队成员时,它们是按照用户的数字ID排序的。我怎么也想不明白怎么才能让这些按顺序排列。

我有一个类似的类:

class Meta:
    ordering = ['name']

这个工作得很好!但是我并不“拥有”User类,当我试着在UserAdmin中使用这个方法时:

class Meta:
    ordering = ['username']

我得到了:

django.core.management.base.CommandError: 一个或多个模型没有通过验证: events.userprofile: "ordering" 指向 "username",这个字段不存在。

user.username也不行。如果我想指定像image_url_s那样的字段……我该怎么告诉管理员按照username来排序我的用户列表呢?谢谢!

4 个回答

4

这可能会有一些风险,但你可以在项目的 models.py 文件中用一行代码来实现:

User._meta.ordering=["username"]
38

这个

class Meta:
    ordering = ['username']

应该是

    ordering = ['user__username']

如果它在你的用户配置文件管理类里。这样可以避免出现错误,但我觉得这对你没有太大帮助。

按照你描述的方式对用户模型进行排序其实挺复杂的,不过你可以看看这个链接 http://code.djangoproject.com/ticket/6089#comment:8,里面有个解决方案。

30

一种方法是为你的团队模型在后台定义一个自定义表单,并重写 manager 字段,使用一个按照正确顺序排列的数据集:

from django import forms

class TeamForm(forms.ModelForm):
    manager = forms.ModelChoiceField(queryset=User.objects.order_by('username'))

    class Meta:
        model = Team

class TeamAdmin(admin.ModelAdmin):
    list_display = ('name', 'manager')
    form = TeamForm

撰写回答