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

Sar*_*ica 0 django django-forms

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

usr = models.ForeignKey(User, related_name='+', limit_choices_to={'is_active': True})
Run Code Online (Sandbox Code Playgroud)

我有一个ModelForm(如下所示)允许usr设置:这一切都很好.但是,用户列表以随机顺序显示.

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['usr', ]
Run Code Online (Sandbox Code Playgroud)

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

Ala*_*air 9

一种选择是ordering为您的模型设置.在您的表单中,模型选择字段应使用相同的顺序.

class MyModel(models.Model):
    ...

    class Meta:
        ordering = ['username']
Run Code Online (Sandbox Code Playgroud)

如果您希望在模型表单中使用不同的顺序,则可以使用a ModelChoiceField并对查询集进行排序.

class MyModelForm(forms.ModelForm):
    usr = forms.ModelChoiceField(Usr.objects.order_by('username'))
    class Meta:
        model = MyModel
        fields = ['usr', ]
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是您丢失了模型字段中的信息(例如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')
Run Code Online (Sandbox Code Playgroud)