如何使用消息和保留的数据呈现表单向导?

时间:2018-11-17 23:13:47

标签: python django recaptcha

我有一个表单向导,用于检查Google Recaptcha是否有效。如果不是,该表格将显示一条消息,指出它无效,请重试。问题在于,表单在发生这种情况时会忘记其数据,因此,如果用户尝试再次提交表单,而不是正常提交​​,则表单将返回步骤1,因为它没有所有数据。关于如何解决这个问题的任何想法?这是代码:

def done(self, form_list, **kwargs):
    recaptcha_response = self.request.POST.get('g-recaptcha-response')
    url = 'https://www.google.com/recaptcha/api/siteverify'
    values = {
            'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY,
            'response': recaptcha_response
    }
    captcha = urllib.parse.urlencode(values).encode()
    req =  urllib.request.Request(url, data=captcha)
    response = urllib.request.urlopen(req)
    result = json.loads(response.read().decode())

    if result['success']:
        *** success logic ***
    else:
        form = self.get_form(step=self.steps.current, data=self.request.POST, files=self.request.FILES)
        messages.add_message(self.request, messages.ERROR, 'Invalid captcha. Please try again.')
        return super(FormView, self).render(form, **kwargs)

1 个答案:

答案 0 :(得分:0)

我不确定您是否使用旧的Django 1.7或更早的版本来使用表单向导,但是我已经将Forms用作多步表单的一部分。而且我已经使用Django Session来存储数据。例如:

class StepOneView(FormView):
    form_class = StepOneForm
    template_name = 'step_one.html'
    success_url = '/step-two/'

    def get_initials(self):
        initial = super(StepOneView, self).get_initial()
        return self.request.session.get('step_one', {})

    def form_valid(self, form):
        self.request.session['step_one'] = form.cleaned_data
        return HttpResponseRedirect(self.get_success_url())

在这里,我在form_valid上使用(此处为 step_one )在会话中存储了cleared_data。在加载初始数据时,我只需使用从会话中获取这些数据即可。

提交成功后,请删除会话数据,如下所示:

def done(self, form_list, **kwargs):
    ...
    if result['success']:
        del self.request.session['step_one']

        self.request.session.modified = True
        # rest of the logics
    ...