Django - после входа в систему перенаправить пользователя на страницу, на которой он был

В настоящее время я работаю над приложением Django, и в настоящее время у меня есть проблема. Проблема в том, что когда пользователь не вошел в систему и находится на странице сообщения в блоге (в данном случае post_detail) и нажимает кнопку «Нравится», пользователь направляется на страницу входа. Однако, как только пользователь вошел в систему, он перенаправляется обратно на домашнюю страницу (в данном случае blog_home, которая показывает список всех сообщений в блоге).

Теперь, это не то, что я хотел. Я хотел, чтобы пользователь вернулся на страницу сообщения в блоге (страница post_detail).

Изучив проблему, я понял, что это связано с LOGIN_REDIRECT_URL. Однако после попытки решить проблему мне трудно перенаправить пользователя на определенную страницу.

Есть ли какие-либо идеи о том, как я могу заставить его работать? Любой вклад действительно ценится.

Настройки.py:

LOGIN_REDIRECT_URL = '/redirect'

views.py(блог):

def wherenext(request):
   if request.user:
       return HttpResponseRedirect(reverse('post_detail'))
   else:
       return HttpResponseRedirect(reverse('blog_home'))
...
@login_required(redirect_field_name="post")
def LikeView(request, pk):
   post = get_object_or_404(Post, id=request.POST.get('post_id'))
   liked = False
   if post.likes.filter(id=request.user.id).exists():
       post.likes.remove(request.user)
       liked = False
   else:
       post.likes.add(request.user)
       liked = True
   return HttpResponseRedirect(reverse('post_detail', args=[str(pk)]))
...
class BlogDetailView(DetailView):
   model = Post
   template_name = 'blog/post_detail.html'
   ...
   
   def get_context_data(self, *args, **kwargs):
       context = super(BlogDetailView, self).get_context_data(*args, **kwargs)
       stuff =get_object_or_404(Post, id=self.kwargs['pk'])
       total_likes = stuff.total_likes()
       liked = False
       if stuff.likes.filter(id=self.request.user.id).exists():
           liked = True

       context["liked"] = liked
       return context

URL.py:

urlpatterns = [
path('redirect/', wherenext, name='post_detail'),
path('post/<uuid:pk>/', BlogDetailView.as_view(), name='post_detail'),
path('',BlogListView.as_view(),name='blog_home'),
]

post_detail.html:

<form action="{% url 'like_post' post.pk %}"method="POST">
{% csrf_token %}
{% if user.is_authenticated %}
   {% if liked %}
   <button type="submit", name="post_id", value="{{ post.id }}", class="btn btn-danger btn-sm">Unlike</button> 
   {% else %}
   <button type="submit", name="post_id", value="{{ post.id }}", class="btn btn-primary btn-sm">Like</button> 
                        
   {% endif %}
{% else %}
      {% if liked %}
         <button type="submit", name="post_id", value="{{ post.id }}", class="btn btn-danger btn-sm">Unlike</button> 
      {% else %}
         <button type="submit", name="post_id", value="{{ post.id }}", class="btn btn-primary btn-sm">Like</button> 
                        
      {% endif %}
{% endif %}
</form>

person SL42    schedule 02.12.2020    source источник
comment
Вы можете добавить URL-адрес перенаправления на свою страницу входа, например: /login?continue=ORIGINAL_URL?   -  person cwlau    schedule 02.12.2020
comment
ознакомьтесь с этим сообщением /вопросы/38431166/   -  person ha-neul    schedule 02.12.2020
comment
@cwlau, я попытался добавить URL-адрес перенаправления на страницу входа, но получаю сообщение об ошибке: 127.0.0.1:8000/login?next=/accounts/login/   -  person SL42    schedule 02.12.2020


Ответы (1)


Если вы используете стандартную структуру аутентификации django, HTML-шаблон формы входа должен включать поле формы next.

<input type="hidden" name="next" value="{{ next }}" />

По умолчанию LoginView будет использовать next в качестве URL-адреса успешного перенаправления.

django-allauth позволяет использовать собственный параметр успеха.

<a href="{% provider_login_url "openid" openid="https://www.google.com/accounts/o8/id" next="/success/url/" %}">Google</a>

для перенаправления на текущую страницу, примерно так:

<a href="{% provider_login_url "openid" openid="https://www.google.com/accounts/o8/id" next=request.get_full_path %}">Google</a>
person Michael Lindsay    schedule 02.12.2020
comment
нет ли проблемы с безопасностью при использовании ‹input type=hidden›? На данный момент я не смог заставить это работать. - person SL42; 02.12.2020
comment
Этот ввод формы в порядке, в нем нет ничего небезопасного. В документации django есть пример кода для получения следующего URL-адреса. docs.djangoproject.com/en/3.1/topics/auth/default - person Michael Lindsay; 02.12.2020
comment
Я добавил ‹input type=hidden›, и он все еще не работает. - person SL42; 03.12.2020
comment
Платформа аутентификации django по умолчанию позволяет использовать следующий параметр, например. /login/?next=/post/UUID/ . Работает ли добавление следующего параметра в строку URL? - person Michael Lindsay; 03.12.2020
comment
добавить ли это в тег формы login.html(action=/login/?next=/post/UUID/)? Я проверил это, и это тоже не сработало. Я предполагаю, что добавил строку URL в неправильном месте. - person SL42; 03.12.2020
comment
Если следующий параметр не работает, вам придется посмотреть на метод или класс представления входа в систему. Django по умолчанию использует следующий параметр, но в этом случае вы можете использовать другой метод аутентификации. - person Michael Lindsay; 03.12.2020
comment
это ошибка, которую я получаю на терминале: Not Found: /login/ - person SL42; 03.12.2020
comment
Я использую django allauth. - person SL42; 03.12.2020
comment
Каков путь к вашему входу в систему? Попробуйте добавить ?next=/post/UUID везде, где находится URL-адрес для входа. - person Michael Lindsay; 03.12.2020
comment
django-allauth, по-видимому, позволяет использовать следующий URL-адрес в теге входа. Из документов: <a href="{% provider_login_url "openid" openid="https://www.google.com/accounts/o8/id" next="/success/url/" %}">Google</a> . - person Michael Lindsay; 03.12.2020