2017-03-08 6 views
2

私はチェックボックス付きの多段階フォームを持っています。ユーザが最初のステップフォームを送信した後、私は彼がセッションでチェックしたオブジェクトを保存し、2番目のステップのフォームでセッションデータでオブジェクトをフィルタしたいと思います。フォームでセッションを取得するにはどうすればよいですか?

これを達成するには、第2ステップの新しいModelFormでセッションを取得する必要があります。残念ながらrequestはフォームに定義されていません。

セッションにアクセスするにはどうすればよいですか?

class IconSubChoiceForm(forms.ModelForm): 
    session_icons = request.session.get('icons') 
    query = Q(tags__contains=session_icons[0]) | Q(tags__contains=session_icons[1]) | Q(tags__contains=session_icons[2]) 
    icons = CustomSubChoiceField(queryset=CanvaIcon.objects.filter(query), widget=forms.CheckboxSelectMultiple) 

    class Meta: 
     model = CanvaIcon 
     fields = ['icons'] 

ご提案がありますか?

答えて

4

見つかったので、フォーム定義内でrequestにアクセスすることはできません。

__init__メソッドをオーバーライドして、余分なパラメータを取得し、フィールドのクエリーセットを設定することができます。下の例では、requestではなく、session_iconsを引数として使用しました。

class IconSubChoiceForm(forms.ModelForm): 
    icons = CustomSubChoiceField(queryset=CanvaIcon.objects.none(), widget=forms.CheckboxSelectMultiple) 

    def __init__(self, *args, **kwargs): 
     session_icons = kwargs.pop('session_icons') 
     super(IconSubChoiceForm, self).__init__(*args, **kwargs) 
     self.fields['icons'].queryset = CanvaIcon.objects.filter(...) 

次に、session_iconsでフォームをインスタンス化します。

form = IconSubChoiceForm(data=request.POST, session_icons=request.session.get('icons')) 
+0

さてさて、私はそれを試してみましたが、それは私にこのエラーを与えている 'TypeError例外:__init __()1つの必要な位置引数不足している:「はqueryset''、CustomSubChoiceFieldは、クエリセットの引数を求めている、私はそれに置くべき何を? – Lindow

+0

空queryset 'queryset = CanvaIcon.objects.none()'を使用することができます。これは '__init__'メソッドで置き換えるためです。 – Alasdair

関連する問題