Как управлять перенаправлением на следующую страницу после входа в систему в Django
Я новичок в django и хотел протестировать миксины, требующие логин, и перенаправление на next_urls. Вход в систему работает нормально, но после входа в систему происходит переход на индексную страницу, а не на ту, которую пользователь хотел посетить. Например, если это url
http://localhost:8000/post/login/?next=/post/1/
После входа в систему перенаправляет на эту ссылку
http://localhost:8000/post/
Вот фрагмент
views.py
def loginUser(request):
if request.method == 'POST':
form = Login(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
next_url = request.GET.get('next', None)
post_id = request.GET.get('post_id', None)
print("Next URL:", next_url)
print("Post ID:", post_id)
if next_url:
return HttpResponseRedirect(next_url)
else:
return redirect('posts:posts-index')
else:
form = Login()
return render(request, 'posts/login.html', {'form': form})
class Content(LoginRequiredMixin, DetailView):
template_name = 'posts/post.html'
context_object_name = 'post'
login_url = 'login/'
def handle_no_permission(self):
if not self.request.user.is_authenticated:
post_id = self.kwargs.get('pk', None)
next_url = reverse('posts:posts-content', kwargs={'pk': post_id})
return redirect(reverse('posts:loginUser') + '?next=' + next_url + '&post_id=' + str(post_id))
return super().handle_no_permission()
model = Post
```
urls.py
```
app_name = 'posts'
urlpatterns = [
path('', Index.as_view(), name='posts-index'),
path('<int:pk>/', Content.as_view(), name='posts-content'),
path('register/', register, name='register'),
path('login/', loginUser, name='loginUser'),
path('logout/', logoutUser, name='logoutUser'),
path('profile/', profile, name='profile')
]
```
and my login.html
```
{% extends 'posts/base.html' %}
{% block title %}
Sign Up
{% endblock %}
{% block content %}
<form action="{% url 'posts:loginUser' %}{% if next %}?next={{ next }}{% endif %}" method="post">
{% csrf_token %}
{{form}}
<button type="submit">Login</button>
</form>
{% endblock %}
```
I tried printing the url_next value but i keep getting none.I also tried adding
```
<form method="post" action="{% url 'posts:loginUser' %}" >
{% csrf_token %}
{{form}}
<input type="hidden" name="next" value="{{next}}" />
<button type="submit">Login</button>
</form>
```
Не делайте ничего в UI, т.е. на страницах html-шаблона, поскольку информация уже есть в URL: в loginUser
def loginUser(request):
nextpage = request.GET.get("next", None)
if nextpage:
return redirect(nextpage)
это все, что вам нужно сделать.
также добавьте это в форму, если она не работает без этого
<input type="hidden" name="next" value="{{ next }}">
Для получения дополнительной информации обратитесь к документации