2017-03-08 60 views
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__方法以獲取額外的參數,併爲您的字段設置查詢集。在下面的例子中,我用session_icons作爲參數,而不是request

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

好吧,我嘗試過,但它給我這個錯誤'類型錯誤:__init __()失蹤1個人需要的位置參數:「queryset'',CustomSubChoiceField是要求一個queryset的說法,我應該怎麼放呢? – Lindow

+0

您可以使用空查詢集'queryset = CanvaIcon.objects.none()',因爲您要在'__init__'方法中替換它。 – Alasdair