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

时间:2018-03-24 14:53:05

标签: python django

我正在用Django 1.11编写一个登录页面。这就是我收到的:

  

上下文必须是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"><br />
        <label for="password">用戶密碼:</label>
        <input type="password" name="password" value="" id="password"><br />
        <input type="submit" value="登入" />
    </form>
</body>

2 个答案:

答案 0 :(得分:1)

不要使用import React from 'react'; export default class ItemAdd extends React.Component { constructor() { super(); this.handleSubmit = this.handleSubmit.bind(this); this.state = { image: null, imagePreviewUrl: null } } handleSubmit(e) { e.preventDefault(); let form = document.forms.itemAdd; this.props.createItem({ name: form.name.value, image: this.state.image }); // Clear the form and state for the next input. form.name.value = ""; this.state.image = null; this.state.imagePreviewUrl = null; } handleImageChange(e) { e.preventDefault(); let reader = new FileReader(); let file = e.target.files[0]; reader.onloadend = () => { this.setState({ image: file, imagePreviewUrl: reader.result }); } reader.readAsDataURL(file) } render() { let { imagePreviewUrl } = this.state; let $imagePreview = null; if (imagePreviewUrl) { $imagePreview = (<img src={imagePreviewUrl} className={'img-preview'} />); } else { $imagePreview = (<div className="previewText">Please select an image.</div>); } return ( <div> <form name="itemAdd" onSubmit={this.handleSubmit}> <table> <tr> <td><label for="name">Name:</label></td> <td><input type="text" name="name" id="name" placeholder="Name" /></td> </tr> <tr> <td><input type="file" onChange={(e) => this.handleImageChange(e)} /></td> <td> <div className="img-preview"> {$imagePreview} </div> </td> </tr> <tr> <td><button>Add</button></td> </tr> </table> </form> </div> ); } } ,它已经过时了。请改用render_to_response快捷方式。

render

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

答案 1 :(得分: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()使用的真知灼见。