GET 格式 POST

GET in POST form

我想在用户登录到他访问的上一个页面后重定向他。 我所做的不起作用。

错误

'QueryDict' object has no attribute 'next'

template.html

{% if request.GET.next %}
<form action="{% url "membres.views.login" %}?next={{ request.GET.next }}" method="post" novalidate class="row">
{% else %}
<form action="{% url "membres.views.login" %}?next=/" method="post" novalidate class="row">
{% endif %}

view.py

def login(request):
    if request.user.is_authenticated():
        return redirect('/')
    else:
        if request.method == 'POST':
            form = LoginForm(request.POST)

            if form.is_valid():
                username = form.cleaned_data['username']
                password = form.cleaned_data['password']
                user = authenticate(username=username, password=password)
                if user:
                    if user.is_active:
                        auth_login(request, user)
                        user = User.objects.get(username=username)
                        user_profile = UserProfile.objects.get(user=user)
                        request.session['user_username'] = username
                        request.session['user_slug'] = user_profile.slug
                        messages.success(request, "Connexion réussie")

                        return redirect(request.GET.next)
                    else:
                        messages.error(request, "Vous n'êtes plus autorisé à vous connecter")
                else:
                    messages.error(request, "Votre identifiant et/ou mot de passe n'est pas correct")

        else:
            form = LoginForm()

        return render(request, 'membres/login.html', locals())

知道为什么它不起作用吗?

感谢您的帮助。

request.GET是类字典对象,不要做request.GET.next,做:request.GET["next"].

更好的是,考虑这样做:request.GET.get('next', '/some_default') 这样如果 ?next= 丢失,您就不会崩溃。

请注意,这仅适用于您的观点。在模板中,Django 会理解 request.GET.next


请注意,您可能会发现在表单中将 next 作为 hidden 输入传递更简单(否则您应该转义 ?next=... 部分)。