Перенаправление на детальное представление после аутентификации в шаблонах django
У меня есть простая модель группы:
class Group(models.Model):
leader = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=55)
description = models.TextField()
joined = models.ManyToManyField(User, blank=True)
С простым шаблоном GroupDetail:
<div>Leader: {{group.leader}}</div>
<div>Name: {{group.name}}</div>
<div>Description: {{group.description}}</div>
{% if user.is_authenticated %}
<form action="{% url 'join_group' group.pk %}" method="POST">
{% csrf_token %}
<button type="submit" name="group_id" value="{{group.id}}">JOIN</button>
</form>
{% else %}
<div><a href="{% url 'login' %}">Login</a> to join chaburah</div>
{% endif %}
Идея заключается в том, что если пользователь аутентифицирован (авторизован), он может присоединиться к группе. Моя проблема в том, что сейчас, когда пользователь нажимает login
, он перенаправляется на страницу входа, но после входа он не возвращается в группу, к которой собирался присоединиться.
Есть ли способ как бы сохранить url, на котором они были, чтобы вернуться к нему после аутентификации?
Это становится все более важным, поскольку я добавляю ссылки приглашения и частные группы, где пользователю отправляется ссылка для вступления в частную группу, которая не отображается на главной странице (используя {% if group.private != True %}
, чтобы пользователь не смог вернуться к деталям группы без необходимости повторного щелчка по отправленной ему ссылке.
Django
нативно поддерживает redirecting
на данную страницу. На практике, если пользователь укажет адрес, к которому у него нет доступа, ему придется log in
. После входа в систему он будет перенаправлен на страницу, к которой он пытался получить доступ.
Я думаю, что вы можете указать доступ к странице из функции модели или представления, а в шаблоне вы можете отрисовать форму.
from django.views.generic.edit import CreateView
from django.contrib.auth.mixins import UserPassesTestMixin
class UserRegistration(UserPassesTestMixin, CreateView):
def test_func(self):
return self.request.user.is_authenticated
Кроме того, success_url
вызывается после того, как он был должным образом обработан.
Я нашел ответ, который сработал в другом вопросе, говорящем о перенаправлении после входа в систему. Но логика в итоге оказалась такой же. Я добавил next
к своей регистрационной ссылке и вернул перенаправление на этот url:
<a href="{% url 'registration' %}?next={{request.path}}">
и с моей точки зрения:
class UserRegistration(generic.CreateView):
form_class = RegisterForm
template_name = 'registration/registration.html'
def form_valid(self, form):
user = form.save()
form.registration_notification()
login(self.request, user, backend='django.contrib.auth.backends.ModelBackend')
return redirect(self.request.GET.get('next'))