Django HttpResponseRedirect正在使用url

时间:2015-07-14 19:22:28

标签: php django

django的新手,来自php背景,通过民意调查应用程序演练,现在我想创建一个登录页面,但我已经有各种各样的错误。这是我感到困惑的事情。我有一个ACCOUNTS [app]并且在该目录中我有一个TEMPLATES [子文件夹],并且只有一个文件夹,也叫做ACCOUNTS。里面是我的所有模板,包括index.html。

├───migrations
│   └───__pycache__
├───templates
│   └───accounts
|         ->the index.html file
└───__pycache__

<html>
<head>
    <title>INDEX</title>
</head>
<body>
INDEX
</body>
</html>

当我运行url localhost:8000 / accounts /它从字面上获取index.html的内容并将其插入URL

http://127.0.0.1:8000/accounts/%3Chtml%3E%0A%3Chead%3E%0A%09%3Ctitle%3EINDEX%3C/title%3E%0A%3C/head%3E%0A%3Cbody%3E%0AINDEX%0A%3C/body%3E%0A%3C/html%3E

帐户 - views.py

from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response, redirect, render
from django.template import RequestContext, loader
from . import LoginView
from django.contrib.auth.decorators import login_required
from django.contrib import auth
from django.core.context_processors import csrf
from django.core.urlresolvers import reverse

@login_required(login_url='/login/')
def index(request):
    template = loader.get_template('accounts/index.html')
    context = RequestContext(request, {
        'Kitty': 5
    })
    return HttpResponseRedirect(template.render(context))

有人可以解释(1)为什么我当前的代码表现得像这样(2)潜在的修复?

谢谢,我愿意阅读或学习必要的东西。

1 个答案:

答案 0 :(得分:1)

如果您想将用户重定向到另一个网址,HttpResponseRedirect类很有用。

def index(request):
    return HttpResponseRedirect("/other-url/")

在您的情况下,您已经渲染了模板上下文。因为您将呈现的模板传递给HttpResponseRedirect,所以它将其视为要重定向到的URL。

最简单的解决方法是改为使用常规HttpResponse

from django.http import HttpResponse

@login_required(login_url='/login/')
def index(request):
    template = loader.get_template('accounts/index.html')
    context = RequestContext(request, {
        'Kitty': 5
    })
    return HttpResponse(template.render(context))

渲染模板并返回响应非常常见,因此您可以使用render快捷方式缩短代码。

from django.shortcuts import render

@login_required(login_url='/login/')
def index(request):
    template_name = 'accounts/index.html'
    context = {
        'Kitty': 5
    }
    return render(request, template_name, context)