在Django Admin中排序多对多字段

10 投票
2 回答
6310 浏览
提问于 2025-04-16 03:38

这是我的设置:

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'

但我不太确定如何写才能访问用户名。

2 个回答

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')
        )
8

上面Hao Lian的评论提到了这个答案,简单来说,就是需要做这些事情:

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()

撰写回答