对login_required视图使用next参数



我的方法在登录后重定向url,效果很好,但模板的代码不是很性感,我可以拥有你的吗?我在views.py 中的函数

def connexion(request):
    error = False
    n=request.GET.get('n')
    if request.method == "POST":
        form = ConnexionForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data["username"]
            password = form.cleaned_data["password"]
            user = authenticate(username=username, password=password)
            if user:
                login(request, user)
                if request.GET.get('n'):
                    return redirect(request.GET['n'])
                else:
                    return redirect(accueil)
            else:
                error = True
    else:
        form = ConnexionForm()
    return render(request, 'blog/connect_user.html', locals())

我的模板:

<h1>Se connecter</h1>
{% if error %}
<p><strong>Utilisateur inconnu ou mauvais mot de passe.</strong></p>
{% endif %}
{%if n %}
<form method="post" action="{% url 'connexion' %}?n={{ n }}">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Se connecter" />
</form>
{% else %}
<form method="post" action="{% url 'connexion' %}">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Se connecter" />
</form>
{% endif %}

我的装饰师:

@login_required(redirect_field_name='n')

为什么不只是:

<input type="hidden" name="n" value="{{ n }}">

在视图中:

n = request.REQUEST.get('n', '')

使用request.REQUEST,您可以使用POST或get获取n,这样您仍然可以链接到类似/login?n=/foo/bar的URL。您也可以毫无问题地执行POST/REDIRECT/GET。

最新更新