2017-11-05 12 views
0

私は最初に空である瞳孔のドロップダウンリスト(ModelMultipleChoiceField)を含むモデルフォームを持っていますが、ユーザーが先生を選択すると、登録された生徒のリストが表示されますこの教師は、AJAXの要求を介して。空のクエリーセットを渡してform_invalidに結果を返します

 self.fields['pupil'] = forms.ModelMultipleChoiceField(queryset=Pupil.objects.none(),) 

すべてが検証まで機能します。最初のクエリーセットはnoneを指しているので、フォームがサブミットされると、エラー "It is invalid choice"が返されます。

pupilフィールドに瞳孔全体を渡して、それをjQueryで空にすることはできますが、それは醜いようです。それを行う正しい方法は何ですか?

+0

あなたは教師の生徒のための第2の要求を行う必要があるか、最初の要求にとJSで教えることにより、そのフィルタの後にそれらのすべてを取得するのいずれか。 –

+0

そのためにclean_pupilメソッドを使用できますか? –

答えて

1

次のようにすることができます。この場合、最初にajaxを使って選択肢をロードした後、空のクエリーセットでフォームをレンダリングします。あなたはポストリクエストでデータを提出します。 POSTリクエストを受け取った場合は、完全なクエリーセットをフォームに送信しています。 上記のケースでは、クエリーセットが空であるため、無効な選択として検証エラーが発生していると説明しました。しかし、この場合、完全なクエリーセットがあるので、完全に動作します。

views.py

def sample_view(request): 
    if request.method == 'POST': 
     queryset = Pupil.objects.all() 
     form = SampleForm(request.POST, queryset=queryset) 
     # your code goes here 
    else: 
     queryset = Pupil.objects.none() 
     form = SampleForm(queryset=queryset) 
     # your code goes here 

forms.py

class SampleForm(forms.ModelForm): 
    def __init__(self, *args, *kwargs): 
     queryset = kwargs.pop('queryset', None) 
     super(SampleForm, self).__init__(*args, **kwargs) 
     self.fields['pupil'] = forms.ModelMultipleChoiceField(queryset=queryset) 
     # your code 
関連する問題