Член CBV в Django

#python #django #django-views

#python #django #django-представления

Вопрос:

Я пытаюсь реализовать LoginRequiredMixin. Например, если пользователь переходит в /post/6 и не входит в систему, он перенаправляется в /auth/login/?next=/post/6 . Я пытаюсь создать функцию, которая перенаправит пользователя либо на /post/* (в соответствии с next в URL-адресе), либо на /, если в URL-адресе нет next . Я попытался получить параметр url в запросе GET, сохранить его в члене CBV, а затем использовать его в post. Но по некоторым причинам он фактически не сохраняется. Вот фрагмент моего кода:

 class LoginView(View):
    redirect_to = ''

    def post(self, request, *args, **kwargs):
        user = authenticate(username=request.POST['login'], password=request.POST['password'])
        print(self.redirect_to) # It's equal to '' here

        if user is not None:
            login(request, user)
        else:
            print("Account doesn't exists!")
        return HttpResponseRedirect(reverse('blog:index'))


    def get(self, request, *args, **kwargs):
        self.redirect_to = 'edited'

        form = RegistrationForm()
        return render(request, 'authorization/login.html', {
            'form': form
        })
  

Может быть, есть какие-либо другие решения? Заранее спасибо!

Комментарии:

1. Это разработано так, чтобы не работать, и вы не должны пытаться. Запросы не имеют состояния. Пользовательская информация должна храниться в БД или сеансе.

2. Django поставляется с представлениями аутентификации , включая login представление, которое обрабатывает параметр next GET. Вы должны использовать это вместо того, чтобы писать свой собственный.

3. @Alasdair я проверю это, спасибо.

Ответ №1:

Я думаю, что ваша самая безопасная ставка — использовать braces :

Установка

 $ pip install braces
  

Использование

В LoginRequiredMixin значительной степени нацелен на репликацию login_required функциональности декоратора для CBV:

 from django.views.generic import TemplateView

from braces.views import LoginRequiredMixin


class SomeSecretView(LoginRequiredMixin, TemplateView):
    template_name = "path/to/template.html"
    login_url = "/login/"

    def get(self, request):
        return self.render_to_response({})