我正在用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>
答案 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()
使用的真知灼见。