HttpResponseRedirect不能正常工作Django 1.7

时间:2015-04-09 11:50:35

标签: django

我在Django中遇到HttpResponseRedirect问题。看起来,无论我尝试什么参数,它都会抛出错误,或者重定向而不更改URL。我在自定义login_user视图上使用它,我希望地址栏中的URL在重定向后更改。如果我使用重定向而不是HttpResponseRedirect,它不会改变。无论哪种方式,我都可以让它提供正确的模板,但URL保持不变。作为Django的新手,如果有人可以向我解释如何执行此操作以及为什么我当前的代码无效,那将会很有帮助。 我在Stack Exchange上看到了几个类似的问题,但答案没有帮助。

以下是我的views.py的相关部分(请注意,由于在此处复制和粘贴,缩进变得很奇怪,并且不是错误的原因)。

from django.http import *
from django.contrib.auth import authenticate, login, logout

def login_user(request):
    logout(request)
    username = password = ''
if request.POST:
    username = request.POST.get('username')
    password = request.POST.get('password')
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)
            return HttpResponseRedirect('dashboard')
        else:
            state = "Your account is not active, please contact the app administrator."
    else:
        state = "Your username and/or password were incorrect."
state = "Please log in below..."
context = RequestContext(request, {
    'state': state,
    'username': username,
})
return render_to_response('bank/auth.html', {}, context)

仪表板是另一个视图的名称,它在我的索引视图的重定向中工作正常。我也试过硬编码网址,但这也不起作用。有什么建议??感谢。

3 个答案:

答案 0 :(得分:5)

如果您使用HttpResponseRedirect,则必须提供网址,而不是网址名称。

您可以使用reverse

获取网址
from django.core.urlresolvers import reverse 

def my_view(request):
    ...
    return HttpResponseRedirect(reverse('dashboard'))

或使用redirect快捷方式。

from django.shortcuts import redirect

def my_view(request):
    ...
    return redirect('dashboard')

如果使用上述任何一种方法都不起作用,那么视图中的其他地方可能存在错误。由于缩进不正确,很难分辨出来。尝试添加一些日志记录或打印语句,以查看您是否真正返回了您认为自己的重定向。

答案 1 :(得分:1)

在这种特殊情况下,问题与我的视图代码无关,实际上是使用JQuery mobile引起的问题。我在这里找到了答案:Error with Redirects in JQuery Mobile用于在页面div上设置data-url属性。 但是,我已经对阿拉斯戴尔的答案进行了投票,因为他的方式是我尝试过的正确方法之一。

答案 2 :(得分:0)

我个人更喜欢以下简单方法:

urls.py

url(r'^dashboard/$', 'appname.views.dashboard_view', name='dashboard_view'), 

views.py

from django.http import HttpResponseRedirect

def dashboard_view(request):
    ...
    return HttpResponseRedirect('/dashboard/')