Django Admin:引用User的ForeignKey和ManyToManyField关系的排序

dan*_*man 19 python sorting django admin user-profile

我有一个应用程序,它使用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
Run Code Online (Sandbox Code Playgroud)

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

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

它已注册到管理员:

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

admin.site.register(Team, TeamAdmin)
Run Code Online (Sandbox Code Playgroud)

唉,在管理界面中,当我从下拉框中选择管理员,或通过多选字段设置团队成员时,他们按用户数字ID排序.对于我的生活,我无法弄清楚如何对这些进行排序.

我有一个类似的课:

class Meta:
    ordering = ['name']
Run Code Online (Sandbox Code Playgroud)

这很棒!但我并不"拥有"这个User课程,当我尝试这个技巧时UserAdmin:

class Meta:
    ordering = ['username']
Run Code Online (Sandbox Code Playgroud)

我明白了:

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?谢谢!

Gre*_*reg 33

这个

class Meta:
    ordering = ['username']
Run Code Online (Sandbox Code Playgroud)

应该

    ordering = ['user__username']
Run Code Online (Sandbox Code Playgroud)

如果它在您的UserProfile管理类中.这将阻止异常,但我认为它不会对你有所帮助.

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


Dan*_*man 24

一种方法是在管理员中定义用于Team模型的自定义表单,并覆盖该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
Run Code Online (Sandbox Code Playgroud)

  • 从django 1.8开始,你还需要在`类Meta`中使用`fields ='__ all __'`. (2认同)