我正在用Django 1.11编写一个登录页面 . 这就是我收到的:
context必须是dict而不是RequestContext .
这是我的代码:
from django.contrib import auth
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.http import HttpResponse
def login(request):
if request.user.is_authenticated():
return HttpResponseRedirect('/index/')
username = request.POST.get('username', '')
password = request.POST.get('password', '')
user = auth.authenticate(username=username, password=password)
if user is not None and user.is_active:
auth.login(request, user)
return HttpResponseRedirect('/index/')
else:
return render_to_response('login.html', RequestContext(request, locals()))
这是我的模板:
<!doctype html>
<body>
<form action="" method="post">
<label for="username">用戶名稱:</label>{% csrf_token %}
<input type="text" name="username" value="{{username}}" id="username">
<label for="password">用戶密碼:</label>
<input type="password" name="password" value="" id="password">
<input type="submit" value="登入" />
</form>
</body>
2 回答
不要使用
render_to_response
,它已经过时了 . 请改用render
快捷方式 .请注意,Django带有登录视图,您不必自己编写 . 不建议使用
locals()
,因为很难看到模板上下文中的内容 .Django 1.11禁止非字典上下文 .
render()
是Django 1.3中render_to_response
的全新快捷方式,它将自动使用RequestContext
. 因此,正如@Alasdair告诉你的那样,不要使用render_to_response()
,它已经过时了 . 请改用render()
快捷方式 .因此,您的代码应如下所示:
我还应该补充一点,我不喜欢使用
locals()
因为它可能会给你带来更多麻烦而不是好处 . 您可以阅读following question,@ AlexMartelli的答案将为您提供有关locals()
使用的真正好的见解 .