在Django Admin中排序多对多字段

时间:2010-09-02 18:44:08

标签: python django-admin

这是我的设置:

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排序,我希望按用户名订购。< / p>

从我到目前为止所读到的内容来看,似乎我需要添加:

   email_users.admin_order_field = 'xxxx'

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

以上解决方案效果很好,但就我而言,我丢失了组件默认具有的所有属性和自定义项(例如必填项,标签等)。
在某些情况下,最好改写__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')
        )