我有一个应用程序,它使用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: 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
对用户列表进行排序?谢谢!
答案 0 :(得分:32)
此
class Meta:
ordering = ['username']
应该是
ordering = ['user__username']
如果它在您的UserProfile管理类中。这将阻止异常,但我认为它不会对你有所帮助。
按照您的描述订购用户模型非常棘手,但请参阅http://code.djangoproject.com/ticket/6089#comment:8了解解决方案。
答案 1 :(得分:24)
一种方法是在管理员中定义用于团队模型的自定义表单,并覆盖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
答案 2 :(得分:3)
由于某些原因,这可能会有危险,但这可以在项目的models.py
文件中的一行中完成:
User._meta.ordering=["username"]
答案 3 :(得分: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)