【问题标题】:Error while accessing request.session['key'] inside forms. [using CheckboxSelectMultiple]访问表单中的 request.session['key'] 时出错。 [使用 CheckboxSelectMultiple]
【发布时间】:2020-01-09 20:41:07
【问题描述】:

我有两个名为 GoodAtFormPaidForForm 的表单。它们的作用如下...

  1. GoodAtFormrequest.session['love'] 的列表中获取输入并将其呈现给用户。

  2. 然后用户会看到一个CheckboXSelectMultiple 字段,以便用户选择。

  3. 在视图中提交表单后,用户选择将存储在另一个列表request.session['good']中。

4.另一个名为PaidForForm 的表单使用该列表进一步向使用CheckBocSelectMultiple 的用户提出问题,并且选择来自列表``request.session['good']。

我的问题是我无法访问表单内的输出数据以供查看。

初始化时输入工作正常。我的表单呈现给定 LOVE 列表中的复选框,但问题是 Form 没有提供输出。它说

 form = GoodAtForm(request.POST)
 input_list = request.session['love']
'QueryDict' object has no attribute 'session'

这是我的GoodAtForm

class GoodAtForm(forms.Form):
    def __init__(self, request, *args, **kwargs):
        super(GoodAtForm, self).__init__(*args, **kwargs)
        input_list = request.session['love']
        self.fields['good'] = forms.MultipleChoiceField(
            label="Select Things You are Good At",
            choices=[(c, c) for c in input_list],
            widget=forms.CheckboxSelectMultiple
        )

查看 GoodAtForm

def show_good_at(request):
    if request.method == 'POST':
        form = GoodAtForm(request.POST)  #it is showing problem here. Throws an exception here
        if form.is_valid():
            if not request.session.get('good'):
                request.session['good'] = []
            request.session['good'] = form.cleaned_data['good']
            return redirect('paid_for')
    else:
        form = GoodAtForm(request=request)  #rendering form as usual from the list 'love'
        return render(request, 'good_at_form.html', {'form':form})

【问题讨论】:

    标签: python django django-forms django-views django-request


    【解决方案1】:

    通常传递给 Django 表单的第一个“位置”参数是请求数据,您已将 request 定义为表单类的第一个参数,但在您的视图中传递 request.POST

    每次实例化表单时,您都需要将请求作为第一个参数传递

    form = GoodForm(request, request.POST)
    

    或将请求更改为关键字参数

    class GoodAtForm(forms.Form):
        def __init__(self, *args, request=None, **kwargs):
            super().__init__(*args, **kwargs)
            ...
    
    form = GoodForm(request.POST, request=request)
    

    【讨论】:

    • 非常感谢朋友!我正在混合两者。代码流畅如水
    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    相关资源
    最近更新 更多