【问题标题】:Ordering a Many-To-Many field in Django Admin在 Django Admin 中订购多对多字段
【发布时间】:2010-09-02 18:44:07
【问题描述】:

这是我的设置:

from django.contrib.auth.models import User

class Product(models.Model):
   ...
   email_users = models.ManyToManyField(User, null=True, blank=True)
   ...

[其他地方]

class ProductAdmin(admin.ModelAdmin):
   list_display = ('name','platform')

admin.site.register(Product, ProductAdmin)

我的主要问题是,当我在管理部分查看“产品”页面时,默认情况下电子邮件用户不会按他们的 ID 排序,我希望按他们的用户名排序。

从我目前阅读的内容来看,我似乎需要添加:

   email_users.admin_order_field = 'xxxx'

但我不太确定访问用户名的语法是什么。

【问题讨论】:

标签: python django-admin


【解决方案1】:

上面郝连的评论中提到了答案,本质上,这是需要做的:

class ProductAdminForm(ModelForm):
   email_users = forms.ModelMultipleChoiceField(queryset=User.objects.order_by('username'))

   class Meta:
      model = Product

class ProductAdmin(admin.ModelAdmin):
   list_display = ('name','platform')
   form = ProductAdminForm

admin.site.register(Product, ProductAdmin)

在我需要 forms.ModelMultipleChoiceField 的意义上,我的略有不同,而提供的答案使用 forms.ModelChoiceField()

【讨论】:

    【解决方案2】:

    上述解决方案效果很好,但在我的情况下,我丢失了组件默认具有的所有属性和自定义项(如必需、标签等)。
    在某些情况下,最好重写 __init__() 方法,以便仅自定义您的查询集,其他任何内容都不会改变。

    class ProductAdminForm(ModelForm):
       class Meta:
          model = Product
          fields = '__all__' # required in new versions
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['email_users'].queryset = (
                self.fields['email_users'].queryset.order_by('username')
            )
    

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 2016-02-23
      • 2016-03-21
      • 2018-07-28
      • 2015-11-05
      • 1970-01-01
      • 2013-09-14
      • 2012-05-15
      • 2018-01-05
      相关资源
      最近更新 更多