我有一个包含用户字段的模型。
usr = models.ForeignKey(User, related_name='+', limit_choices_to={'is_active': True})
我有一个ModelForm
(如下所示),可以设置usr
:这一切都运行正常。但是,用户列表以随机顺序显示。
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['usr', ]
如何在下拉列表中对活动用户列表进行排序?
答案 0 :(得分:8)
一种选择是为您的模型设置ordering
。在您的表单中,模型选择字段应使用相同的顺序。
class MyModel(models.Model):
...
class Meta:
ordering = ['username']
如果您希望在模型表单中使用不同的顺序,则可以使用ModelChoiceField
并对查询集进行排序。
class MyModelForm(forms.ModelForm):
usr = forms.ModelChoiceField(Usr.objects.order_by('username'))
class Meta:
model = MyModel
fields = ['usr', ]
这样做的缺点是您丢失了模型字段中的信息(例如help_text
),除非您在表单中复制它。
为防止重复,您可以使用__init__
方法替换查询集。
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['usr', ]
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
self.fields['usr'].queryset = self.fields['usr'].queryset.order_by('username')