логин пользователя перенаправлять всегда на домашнюю страницу - PullRequest
0 голосов
/ 15 апреля 2019

Я создаю alogin-представление, в котором, когда пользователь не является ни одним, затем вошел в систему, он должен перейти на ту же страницу перед входом в систему, а затем перейти на другой URL-адрес, но он всегда переходит на другой URL-адрес, хотя он должен идти в первую очередь перенаправления

views.py

def login_page(request):
form = LoginForm(request.POST or None)
context = {
        "form": form
        }
next_get_url= request.GET.get('next')
next_post_url= request.POST.get('next')
redirect_path = next_get_url or next_post_url or None
if form.is_valid():
    print(form.cleaned_data)
    username = form.cleaned_data.get("username")
    password = form.cleaned_data.get("password")
    user = authenticate(request, username=username, password=password)
    print(user)
    if user is not None:
        login(request, user)
        if  is_safe_url(redirect_path, request.get_host()):
            return(redirect(redirect_path))
        else:
            return (redirect('/'))
    else:
        print ("Error")
return render(request, "accounts/login.html",context)

forms.py:

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

Я имею в виду, что это всегда так:

 else:
        return (redirect('/'))

всякий раз, когда это так:

if  is_safe_url(redirect_path, request.get_host()):
            return(redirect(redirect_path))

все попытки и найденные решения не помогли! и заранее спасибо

Ответы [ 3 ]

1 голос
/ 15 апреля 2019

Во-первых, Django поставляется с LoginView, который обрабатывает перенаправление для вас.было бы лучше использовать это, чем написать свое собственное представление.

Если вы действительно пишете свое собственное представление, тогда вам нужно включить свой redirect_path в свой context словарь , вот где Django делаетравен , и затем вам нужно включить его в качестве скрытого поля в форму входа (см. пример шаблона в документации для LoginView:

<form ...>
    ...
    <input type="submit" value="login">
    <input type="hidden" name="next" value="{{ next }}">
</form>
0 голосов
/ 15 апреля 2019

попробуйте методы рендеринга li this

def my_view(request):

username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
    login(request, user)
    # Redirect to a success page.
    render(request , 'bootstrap/page_learn.html')
else:
    # Return an 'invalid login' error message.
    render(request , 'bootstrap/page_learn.html')
0 голосов
/ 15 апреля 2019

Вы должны использовать

redirect_path = next_get_url or next_post_url or "/"

, потому что если вы передадите None на is_safe_url, он вернет False, поскольку он принимает только действительные URL.

...