2009-09-24 84 views
18

我有一个应用程序,利用Django的UserProfile来扩展内置的Django User模型。看起来有点像:Django管理:订购的ForeignKey和ManyToManyField关系引用用户

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) 

唉,在管理inteface ,当我从下拉框中选择经理时,或者通过多选字段设置团队成员时,它们将按照用户数字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告诉管理员对我的用户列表进行分类?谢谢!

回答

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 
+0

谢谢,丹尼尔! – dannyman 2009-09-28 19:47:09

+2

由于django 1.8,你还需要在'Class Meta'里面的'fields ='__all __''。 – Flash 2017-04-24 12:25:00

26

class Meta: 
    ordering = ['username'] 

应该

ordering = ['user__username'] 

,如果它在你的用户配置管理类。这会阻止异常,但我认为它不会对您有所帮助。

按照您所描述的顺序排列用户模型非常棘手,但请参阅http://code.djangoproject.com/ticket/6089#comment:8获取解决方案。

3

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

User._meta.ordering=["username"] 
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)