【问题标题】:How can I get session in forms?如何在表单中获取会话?
【发布时间】:2017-07-28 20:52:25
【问题描述】:

我有一个带有复选框的多步表单,在用户提交第一步表单后,我保存了他在会话中检查的对象,在第二步表单中,我想使用会话数据过滤对象。

为此,我需要在新的 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']

有什么建议吗?

【问题讨论】:

  • 你能分享代码吗?我有同样的要求,但是当我使用form =FormName(request.post) 处理表单时,它会抛出异常说Queryset has no attribute session
  • 另外我正在使用request.session['key']=[]MultipleChoiceFieldForm
  • 你能帮我吗with this one

标签: python django django-forms django-sessions


【解决方案1】:

如您所见,您无法在表单定义中访问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'))

【讨论】:

  • 好吧,我试过了,但它给了我这个错误TypeError: __init__() missing 1 required positional argument: 'queryset',CustomSubChoiceField 正在询问一个查询集参数,我应该在里面放什么?
  • 您可以使用空查询集queryset=CanvaIcon.objects.none(),因为您将在__init__ 方法中替换它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2014-08-13
  • 2012-09-04
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
相关资源
最近更新 更多