【问题标题】:Django: HttpResponseRedirect doesn't redirect to next pageDjango:HttpResponseRedirect 不会重定向到下一页
【发布时间】:2015-10-04 09:52:08
【问题描述】:

我正在尝试使用 django 的 auth 框架登录用户,然后重定向到新页面。以下是与应用程序相关的文件(名为portal)。

forms.py

class StudentLoginForm(forms.Form):
    username = forms.CharField(required = True, label = 'Webmail', max_length = 25)
    password = forms.CharField(widget=forms.PasswordInput)

urls.py

urlpatterns = [
    url(r'^stud_login/$', views.stud_login, name = 'stud_login'),
    url(r'^stud_logout/$', views.stud_logout, name = 'stud_logout'),
    url(r'^atry/$', views.atry, name = 'atry'),
]

views.py

def stud_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)

        # args = {}
        # args['message'] = "Login Successful"
        return HttpResponseRedirect('portal/atry')

    else:

        args = {}
        args['login_failed'] = True
        args['login_tried'] = True
        args['error_message'] = "Wrong credentials"
        args['login_form'] = StudentLoginForm()

        return render(request, 'portal/login.html', args)

else:

    args = {}
    args.update(csrf(request))
    args['login_form'] = StudentLoginForm()
    args['login_tried'] = False

    return render(request, 'portal/login.html', args)

@login_required
def atry(request):
    # message = "Login Successful"
    # args['message'] = message
    return HttpResponseRedirect('/portal/atry/')


@login_required
def stud_logout(request):
    auth.logout(request)
    # args = {}
    return HttpResponseRedirect('/portal/stud_login')

login.html

<p>Login Form</p>
{% if login_tried %}
    {% if login_failed %}
        <p>{{ error_message }}</p>
    {% endif %}
{% endif %}
<form action="{% url 'stud_login' %}" method="post" accept-charset="utf-8">
    {% csrf_token %}

    {{ login_form.as_p}}

    <input type="submit" value="Login">
</form>

我面临的问题是,当我在登录表单中输入portal/stud_login 的详细信息并单击Login 时,视图会将用户重定向到/portal/stud_login/portal/atry。而且这个网址与urls.py 中的任何urlpatterns 都不匹配。它应该重定向到/portal/atry

谁能解释我做错了什么?

【问题讨论】:

    标签: django redirect django-views django-authentication


    【解决方案1】:

    您缺少前导正斜杠。您可以通过以下方式解决问题:

    return HttpResponseRedirect('/portal/atry')
    

    在您当前的代码中,portal/atry 是相对的。它被添加到登录 url /portal/stud_login/,以生成 /portal/stud_login/portal/atry

    更好的方法是使用 reverse 和 url 模式的名称,而不是在代码中硬编码 url。

    from django.core.urlresolvers import reverse
    
    return HttpResponseRedirect(reverse('atry'))
    

    这可以使用redirect 快捷方式进一步简化。

    from django.shortcuts import redirect
    
    return redirect('atry')
    

    【讨论】:

    • 感谢您推荐reverseredirect 函数。
    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 2014-05-17
    • 2017-07-14
    • 2017-08-03
    相关资源
    最近更新 更多