Django formtools логика бизнеса между формами - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь реализовать функцию добавления OTP в django-formtools и pyotp. (Я знаю, что для этого есть библиотека, но я хочу сделать это дома.)

Рабочий процесс такой.

Enter captcha -> pass? -> show otp secret 
-> user enters generated otp code 
-> does the code matches with the secret? 
-> save secret to user model.

Сначала я создал две формы,

# forms.py   
class OTPUpdateForm1(forms.Form):
    captcha = CaptchaField()

class OTPUpdateForm2(OTPForm):
    otp = forms.CharField()
    def clean(self):
        # validate otp code

, а затем создал форму.

# views.py
class NewOtpWizard(SessionWizardView):
    form_list = [OTPUpdateForm1, OTPUpdateForm2]
    success_url = reverse_lazy('otp-update')

    def get_template_names(self):
        return f'profile/editotp/step{self.steps.step}.html'

    def done(self, form_list, **kwargs):
        self.request.user.profile.save_totp_secret(data_for_step1['totp_secret'])
        return HttpResponseRedirect(success_url)

Итак, мне нужен логический код междудве формы, то есть

  1. для создания секретного OPP
  2. для проверки OPP с секретом
  3. для сохранения секретного OPP

Мои вопросы

  1. Где вы положили код для создания секретного OTP?Я переопределил get_context_data, но я думаю, что это не то место.Это делается даже тогда, когда пользователь не может проверить otp, что приводит к новому секрету otp.
  2. Как передать сгенерированный секрет otp в OTPUpdateForm2, чтобы он мог проверять и повышать ValidationError при неправильной проверке?
  3. Как сохранить созданный OTP-секрет, когда OTPUpdateForm2 прошло?

Чтобы уточнить, о чем я спрашиваю,

class MyFormView(View):
    form_class = MyForm
    initial = {'key': 'value'}
    template_name = 'form_template.html'

    def get(self, request, *args, **kwargs):
        form = self.form_class(initial=self.initial)
        # <these parts>
        return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            # <these parts>
            return HttpResponseRedirect('/success/')
        # <these parts>
        return render(request, self.template_name, {'form': form})

Где находятся <these parts> в формах Django?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...