在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排序,我希望能按他们的用户名排序。
根据我目前的了解,似乎我需要添加:
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()