Django: доступ к переменным в представлениях на основе классов - PullRequest
1 голос
/ 01 октября 2019

Я настраиваю веб-сайт с довольно простой системой пользователей, где вы можете выполнять обычные действия, такие как вход в систему, изменение пароля и т. Д. Я использую пример проекта Django и немного его изменяю тут и там.

Когда пользователь вошел в систему, я могу получить доступ к адресу электронной почты пользователя и поместить его на страницу, добавив его в шаблон {{ request.user.email }}.

Но по ссылке, отправленной пользователю по электронной почте для сбросаих пароль, где пользователь не вошел в систему, не работает. Я предполагаю, что должен быть возможный доступ к нему как-то.

Это представление класса, которое я использую:

class RestorePasswordConfirmView(PasswordResetConfirmView):
    template_name = 'accounts/restore_password_confirm.html'

    def form_valid(self, form):
        form.save()
        messages.success(self.request, _('Your password has been set. You may go ahead and log in now.'))
        return redirect('/')

    def get_context_data(self, **kwargs):
        context = super(RestorePasswordConfirmView, self).get_context_data(**kwargs)
        context = {**context, **host_(self.request)}
        return context

Есть ли способ получить доступ к user.emailпеременная

1 Ответ

3 голосов
/ 01 октября 2019

В PasswordResetConfirmView ожидается, что {{request.user.email}} не будет работать, потому что нет аутентифицированного пользователя, установленного по запросу. {{request.user}} будет содержать объект AnonymousUser.

Однако, если мы посмотрим, как реализован PasswordResetConfirmView, мы заметим, что в PasswordResetConfirmView.dispatch() Django устанавливает пользователя на self какэто:

@method_decorator(sensitive_post_parameters())
@method_decorator(never_cache)
def dispatch(self, *args, **kwargs):
    assert 'uidb64' in kwargs and 'token' in kwargs

    self.validlink = False
    self.user = self.get_user(kwargs['uidb64'])

Это означает, что вы можете переопределить get_context_data(), как вы делали выше, и убедиться, что вы также отправляете пользователя в шаблон:

def get_context_data(self, **kwargs):
    context = super(RestorePasswordConfirmView, self).get_context_data(**kwargs)
    context = {**context, **host_(self.request)}
    context['user'] = self.user
    return context
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...