首页 文章

Django 1.11上下文必须是dict而不是RequestContext

提问于
浏览
0

我正在用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 回答

  • 1

    不要使用 render_to_response ,它已经过时了 . 请改用 render 快捷方式 .

    return render(request, 'login.html', locals())
    

    请注意,Django带有登录视图,您不必自己编写 . 不建议使用 locals() ,因为很难看到模板上下文中的内容 .

  • 0

    Django 1.11禁止非字典上下文 .

    为了与多个模板引擎兼容,django.template.backends.django.Template.render()必须接收上下文字典而不是Context或RequestContext . 如果你传递了两个类中的任何一个,那么传递一个字典 - 这样做是向后兼容旧版本的Django .

    render() 是Django 1.3中 render_to_response 的全新快捷方式,它将自动使用 RequestContext . 因此,正如@Alasdair告诉你的那样,不要使用 render_to_response() ,它已经过时了 . 请改用 render() 快捷方式 .

    因此,您的代码应如下所示:

    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(request, 'login.html', locals())
    

    我还应该补充一点,我不喜欢使用 locals() 因为它可能会给你带来更多麻烦而不是好处 . 您可以阅读following question,@ AlexMartelli的答案将为您提供有关 locals() 使用的真正好的见解 .

相关问题