我有一个表单向导,用于检查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)
答案 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
...