Django HttpResponseRedirect vs render_to_response - 如何让登录表单以我需要的方式运行

时间:2013-08-09 21:24:21

标签: python django django-views httpresponse django-urls

我已经检查了以下stackoverflow question regarding the difference between HttpResponse, HttpResponseRedirect, and render_to_response,并且已经浏览了官方的django文档,但我真的不确定如何最好地获得我想要创建的功能。

现在我有一个带有登录功能的 index.html (如下面的 views.py 所示),其中render_to_response带来了我的门户/ index.html中即可。但是,正如 urls.py (见下文)所指示的那样,我浏览器的网址栏中的网址为http://127.0.0.1:8000/login/。这意味着刷新页面会强制表单再次运行。

如何将该网址(登录后)看作http://127.0.0.1:8000/,或者如果不可行,http://127.0.0.1:8000/portal/ - 这是因为我认为每次重新加载网页时都很笨拙登录后,它会强制浏览器打开提示您确定要再次发送表单吗?

非常感谢您帮助Django新手!

views.py

@cache_page(60 * 15)
def login_user(request):
    #inactive_image_url = ""
    #invalid_credentials_url = ""
    context_instance=RequestContext(request)
    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)            
                state = "You're successfully logged in!"
                return render_to_response('ucproject/portal/index.html', 
                        {'state':state, 'username':username}, context_instance=RequestContext(request))
            else:
                #state_img = inactive_image_url
                state = "Your account is not active, please contact UC admin."
        else:
            #state_img = invalid_credentials_url
            state = "Your username and/or password were incorrect."
    return render_to_response('ucproject/index.html', 
            {'state': state,
             #'state_img': state_img,
             'username': username
            }, context_instance=RequestContext(request))

def portal(request):
    username = 'username'
    return render_to_response('ucproject/portal/index.html', 
            {'state': state,'username': username}, context_instance=RequestContext(request))

urls.py

# Login / logout.
url(r'^registration/$', 'portal.views.registration'),
url(r'^login/$', 'portal.views.login_user'),
url(r'^portal/$', 'portal.views.portal'),
url(r'^portal/index.html$', 'portal.views.portal'),

1 个答案:

答案 0 :(得分:3)

使用重定向替换此处的HttpResponse:

if user.is_active:
    login(request, user)            
    state = "You're successfully logged in!"
    return render_to_response('ucproject/portal/index.html', 
           {'state':state, 'username':username}, context_instance=RequestContext(request))

相反,您希望在urls.py中使用名称来消除歧义:

urls.py
url(r'^portal/$', 'portal.views.portal', name='home'),
url(r'^portal/index.html$', 'portal.views.portal', name='home_index'),

然后在你的视图中使用这样的东西:

if user.is_active:
    login(request, user)
    return redirect('home')

redirect是一个快捷方式功能,但您也可以创建并返回HttpResponseRedirect个对象。通常没有必要这样做。

相关问题