21

我有一个使用 DjangoUserProfile扩展内置 DjangoUser模型的应用程序。看起来有点像:

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: One or more models did not validate: events.userprofile: "ordering" refers to "username", a field that doesn't exist.

user.username也不行。我可以指定,image_url_s如果我想的话。. . 如何告诉管理员对我的用户列表进行排序username?谢谢!

4

4 回答 4

37

class Meta:
    ordering = ['username']

应该

    ordering = ['user__username']

如果它在您的 UserProfile 管理类中。这将停止异常,但我认为它对您没有帮助。

按照您的描述订购用户模型非常棘手,但请参阅http://code.djangoproject.com/ticket/6089#comment:8以获得解决方案。

于 2009-09-24T21:15:58.617 回答
29

一种方法是在管理员中定义用于您的团队模型的自定义表单,并覆盖该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
于 2009-09-24T21:10:23.990 回答
3

由于某种原因,这可能很危险,但这可以在项目models.py文件的一行中完成:

User._meta.ordering=["username"]
于 2011-11-11T18:54:28.200 回答
1

对我来说,唯一可行的解​​决方案是使用Proxy Model。如文档中所述,您甚至可以为内置模型创建自己的代理模型,并自定义常规模型中的任何内容:

class OrderedUser(User):
    class Meta:
        proxy = True
        ordering = ["username"]
    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)

之后,在您的模型中,只需将外键更改为:

user = models.OneToOneField(OrderedUser, unique=True)

甚至更合适

user = models.OneToOneField(OrderedUser, unique = True, parent_link = True)
于 2014-05-14T08:52:46.480 回答