Как инициировать пользователя в SetPasswordForm через Django FormView CBV? - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть следующий вид, который использует встроенный SetPasswordForm от Django.Сама форма требует, чтобы вы инициализировали ее с пользователем (settings.AUTH_USER_MODEL) при ее создании.

Представление проверяет параметры получения uid / token (или разрешает аутентифицированным пользователям), а затем предоставляет пользователю форму.У меня есть запрос GET, создающий форму правильно, но есть ли лучший способ?

Что было бы лучшим способом установить то, что в настоящее время self.init_user в запросе POST: добавить user.pk в качестве скрытого поляв SetPasswordForm или установить объект сеансов?

from django.views.generic.edit import FormView
from django.contrib.auth.forms import SetPasswordForm

class PasswordResetView(FormView):
    """
    Reset user password. Either with provided uid/token get parameters
    or if the user is logged in.
    """
    template_name = 'users/password_reset.html'
    form_class = SetPasswordForm
    success_url = 'home'
    init_user = None

    def corrupt_link_redirect(self, request):
        messages.error(
            self.request,
            user_strings.PASSWORD_RESET_INVALID_LINK
        )
        return redirect('forgot_password')

    def get_form(self):
        form_class = self.get_form_class()
        if not self.init_user:
            return Http404() ## Refine this
        return form_class(self.init_user, **self.get_form_kwargs())

    def post(self, request, *args, **kwargs):
        ## *****************************
        ## EITHER NEED TO INCLUDE THE USER.PK IN THE SetPasswordForm OR 
        ## PUT IT IN A SESSION SO WE CAN SET self.init_user TO PREVENT
        ## THE get_form() METHOD FROM 404'ING
        ## *****************************
        return super(PasswordResetView, self).post(request, *args, **kwargs)

    def get(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            ## User is logged in so present them with the password reset form
            self.init_user = request.user
            return super(PasswordResetView, self).get(request, *args, **kwargs)
        try:
            uidb64 = request.GET.get('uid')
            token = request.GET.get('token')
            if uidb64 is None or token is None:
                return self.corrupt_link_redirect(request) ## Failure redirect
            uid = force_text(urlsafe_base64_decode(uidb64))
            user = User.objects.get(pk=uid)
        except (TypeError, ValueError, OverflowError, User.DoesNotExist):
            return self.corrupt_link_redirect(request) ## Failure redirect

        if user is not None and PasswordResetTokenGenerator().check_token(user, token):
            self.init_user = user
            return super(PasswordResetView, self).get(request, *args, **kwargs)
        return self.corrupt_link_redirect(request) ## Failure redirect

    def form_valid(self, form):
        try:
            form.save(self.request)
        except User.DoesNotExist:
            pass
        messages.success(
            self.request,
            user_strings.PASSWORD_RESET_SUCCESS + \
            user_strings.PASSWORD_RESET_SUCCESS_LOGIN_REMINDER if not self.request.user.is_authenticated else ''
        )
        return super(PasswordResetView, self).is_valid(form)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...