2017-10-11 14 views
0

私はクエリセットを使用して選択肢をフィルタリングすることになっているDjangoのフォームを持っている:Djangoフォームでクエリーセットキャッシュを無効にする方法は?

class GenerateStudentAttendanceForm(forms.Form): 
    selected_class = forms.ModelChoiceField(queryset=Class.on_site.filter(
     is_active=True, 
     academic_year__is_active=True 
    )) 
    date = forms.DateField(initial=now().date()) 

問題は、フォームがインスタンス化され、サイトが変更された場合でも、後続の要求のために使用される場合にClass.on_site.filterが評価されていることです。

どうすればこの問題を回避できますか?

+0

Classオブジェクトの1つが削除されても、ドロップダウンリストで引き続き使用できると言っていますか? –

+0

@SandeepBalagopal私はそれを試していませんでしたが、表示されているクラスはデフォルトのサイトからのものであるため、そう思っています。 –

+0

'on_site'が何であるかを示す必要があります。 –

答えて

0

Formクラスのコンストラクターをオーバーライドして、フォームのインスタンス化ごとにクエリーセットが評価されるようにフィールドをインスタンス化できます。

class GenerateStudentAttendanceForm(forms.Form): 
    date = forms.DateField(initial=now().date()) 

    def __init__(self, *args, **kwargs): 
     super(GenerateStudentAttendanceForm, self).__init__(*args, **kwargs) 

     # add the key `selected_class` to the dictionary of `fields` 
     self.fields['selected_class'] = forms.ModelChoiceField(queryset=Class.on_site.filter(
      is_active=True, 
      academic_year__is_active=True 
     )) 
+1

'GenerateStudentAttendanceForm 'オブジェクトには' fields '属性がありません。最初に' super(GenerateStudentAttendanceForm、self).__ init __(* args、** kwargs) 'を呼び出す必要があります。 –

+0

私はその方法だけを自分のプロジェクトで実装しました。 –

関連する問題