#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({})