在 Django Admin 中订购多对多字段

问题描述 投票:0回答:3

这是我的设置:

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
3个回答
8
投票

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

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


3
投票

上面的解决方案效果很好,但就我而言,我丢失了组件默认具有的所有属性和自定义(如必需的、标签等)。
在某些情况下,最好重写

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

0
投票

对于我的需求,我不想定义一个单独的表单,所以我简单地这样做了:

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    ...
def get_form(self, request, obj, **kwargs):
    form = super().get_form(request, obj, **kwargs)
    form.base_fields['email_users'].queryset = form.base_fields['email_users'].queryset.order_by('username')
    return form
© www.soinside.com 2019 - 2024. All rights reserved.