如何在ModelForm中对ChoiceField进行排序?

时间:2017-03-15 13:56:13

标签: django django-forms

我有一个包含用户字段的模型。

usr = models.ForeignKey(User, related_name='+', limit_choices_to={'is_active': True})

我有一个ModelForm(如下所示),可以设置usr:这一切都运行正常。但是,用户列表以随机顺序显示。

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['usr', ]

如何在下拉列表中对活动用户列表进行排序?

1 个答案:

答案 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')