以POST形式获取

时间:2015-02-02 12:59:10

标签: django django-views

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

错误

'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())

知道为什么它不起作用?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

request.GET是类似字典的对象,请勿request.GET.next执行:request.GET["next"]

更好的是,考虑一下:request.GET.get('next', '/some_default')如果以某种方式?next=丢失,你就不会崩溃。

请注意,这仅适用于到您的视图。在模板中,Django将理解request.GET.next


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