Как сделать мастер формы с сообщением и сохранением данных? - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть мастер форм, который проверяет, действительна ли Google Reaptcha. Если нет, в форме отображается сообщение о том, что оно недействительно, и, пожалуйста, повторите попытку. Проблема заключается в том, что форма забывает свои данные, когда это происходит, поэтому, если пользователь пытается отправить форму снова, вместо обычной отправки, форма возвращается к шагу 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 голосов
/ 18 ноября 2018

Я не уверен, что вы используете старый Django 1.7 или старше для использования мастера форм, но я использовал Формы как часть многошаговых форм.И я использовал 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 я сохранил cleared_data в сеансе с ключом (здесь его step_one ).А при загрузке исходных данных я просто получаю их из сеанса с помощью клавиши .

И после успешной отправки удалите данные сеанса следующим образом:

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

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