【问题标题】:Django Admin: Ordering of ForeignKey and ManyToManyField relations referencing UserDjango Admin:ForeignKey 和 ManyToManyField 关系引用用户的排序
【发布时间】:2010-12-01 05:48:16
【问题描述】:

我有一个应用程序,它利用 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)

并且它被注册到Admin中:

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 对我的用户列表进行排序?谢谢!

【问题讨论】:

    标签: python django sorting admin user-profile


    【解决方案1】:

    这个

    class Meta:
        ordering = ['username']
    

    应该是

        ordering = ['user__username']
    

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

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

    【讨论】:

      【解决方案2】:

      一种方法是在管理员中为您的团队模型定义一个自定义表单,并覆盖 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
      

      【讨论】:

      • 从 django 1.8 开始,您还需要在 fields = '__all__' 内部 Class Meta
      【解决方案3】:

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

      User._meta.ordering=["username"]
      

      【讨论】:

        【解决方案4】:

        对我来说,唯一可行的解​​决方案是使用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)
        

        【讨论】:

          猜你喜欢
          • 2017-07-21
          • 2011-12-24
          • 1970-01-01
          • 2014-12-04
          • 1970-01-01
          • 1970-01-01
          • 2011-09-26
          • 2014-02-28
          • 1970-01-01
          相关资源
          最近更新 更多