Перенаправление на детальное представление после аутентификации в шаблонах 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'))
Вернуться на верх