2017-03-15 9 views
0

私はユーザーフィールドを含むモデルを持っています。ModelFormでChoiceFieldをソートする方法は?

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

モデルフォームを表示してください。あなたは何を注文するのですか? – Alasdair

+0

@ Alasdair Done。 'username'でアルファベット順にユーザをソートすると問題ありません。 – Sardathrion

答えて

3

1つのオプションは、ご使用のモデルに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') 
関連する問題