Django: перенаправление, чтобы посмотреть, где был вызван логин - PullRequest
0 голосов
/ 23 марта 2020

У меня очень распространенная проблема - после входа я хочу перенаправить на страницу, где был вызван вход. Я могу описать ситуацию точно так, как здесь: Django: перенаправление на предыдущую страницу после входа в систему

Существует 2 варианта входа в систему - с домашней страницы (которая определяется в базе . html) и из боке. html (другие виды наследуются от боке)

моя база. html и боке. html есть тот же блок для перенаправления для входа в систему. Разница в том, что имя входа, вызванное с домашней страницы, должно вернуться на домашнюю страницу, а с другой страницы вернуться на страницу, где был вызван.

<li class="nav-item">
    <a class="nav-link" href="{% url 'login' %}">Login</a>
</li>

мой логин. html

<form method="POST">
{% csrf_token %}
<div class="form-group">
    <input type="text" class="form-control" placeholder="Enter Username" name="username" required>
</div>
<div class="form-group">
    <input type="password" class="form-control" placeholder="Enter Password" name="password" required>
</div>
<div class="form-group">
    <button type="submit" class="btn btn-dark">Login</button>
</div>
</form>

и views.py

def login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(username=username,password=password)
        if user is not None:
            auth.login(request,user)
            return redirect('home')
        else:
            messages.info(request,'Invalid credentials')
            return redirect('login')
    else:
        return render(request,'login.html')

Я пытался добавить рядом с моей формой в логин. html, но это не так т работа. При доступе к входу со страницы, отличной от домашней, это было похоже на localhost:8000/login?next=/bokeh/, и после отправки формы я все еще был на входе, но URL изменился на localhost:8000/login?next=. Я знаю, что это довольно сложно объяснить, но я добавлю другую нуждающуюся информацию.

1 Ответ

1 голос
/ 23 марта 2020

Во-первых, измените шаблон так, чтобы он включал параметр urlencoded next в URL-адрес входа в систему:

<li class="nav-item">
    <a class="nav-link" href="{% url 'login' %}?next={{ request.path |urlencode }}">Login</a>
</li>

Во-вторых, шаблон вашего входа должен сохранить значение next :

<form method="POST">
<input type="hidden" name="next" value=""{{ next }}">
{% csrf_token %}
<div class="form-group">
    <input type="text" class="form-control" placeholder="Enter Username" name="username" required>
</div>
<div class="form-group">
    <input type="password" class="form-control" placeholder="Enter Password" name="password" required>
</div>
<div class="form-group">
    <button type="submit" class="btn btn-dark">Login</button>
</div>
</form>

В-третьих, ваше представление входа в систему должно извлечь параметр URL и передать его шаблону:

from django.conf import settings

def login(request):
    if request.method == 'GET':
        next = request.GET.get('next', settings.LOGIN_REDIRECT_URL)
        return render(request, 'login.html', {'next': next})

    if request.method == 'POST':
        next = request.POST['next']
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(username=username,password=password)
        if user is not None:
            auth.login(request,user)
            return redirect(next)
        else:
            messages.info(request,'Invalid credentials')
            return redirect('login')

Наконец, вы должны рассмотреть возможность использования аутентификации Django Просмотры вместо написания ваших собственных просмотров входа в систему!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...