这是我的设置:
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'
但我不太确定访问用户名的语法是什么。
上面郝炼的评论中提到了答案,本质上,这就是需要做的:
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()
上面的解决方案效果很好,但就我而言,我丢失了组件默认具有的所有属性和自定义(如必需的、标签等)。
在某些情况下,最好重写
__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')
)
对于我的需求,我不想定义一个单独的表单,所以我简单地这样做了:
@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