Django Admin:外键和多对多字段中用户的排序问题
我有一个应用程序,它使用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