Sou*_*dar 5 django render csrf render-to-response
我正在Django中尝试一个简单的用户注册表单.我使用时没有生成CSRF令牌render_to_response
return render_to_response('registration/register.html',RequestContext(request,{'form':RegistrationForm()}))
在我使用的时候生成CSRF令牌 render
return render(request,'registration/register.html',{'form':RegistrationForm()})
我做错了什么 render_to_response
以下是相关的代码块
views.py
@csrf_protect
def register(request):
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
user = User.objects.create_user(
username=form.cleaned_data['username'],
password=form.cleaned_data['password1'],
email=form.cleaned_data['email']
)
return HttpResponseRedirect('/register_success/')
else:
return render_to_response('registration/register.html', RequestContext(request, {'form': RegistrationForm()}))
Run Code Online (Sandbox Code Playgroud)
register.html
{% extends "base.html" %}
{% block title %}User Registration{% endblock %}
{% block content %}
<form method="post" action=".">
{% csrf_token %}
<table border="0">
{{ form.as_table }}
</table>
<input type="submit" value="Register" />
</form>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
推荐的方法是使用render而不是render_to_response.代码更简单,CSRF令牌将起作用,因为render它将使用请求上下文来呈现模板.
return render(request, 'registration/register.html', {'form': RegistrationForm()})
Run Code Online (Sandbox Code Playgroud)
文档建议您不要使用render_to_response.在Django 1.10之前,您可以手动传递a RequestContext作为第三个参数,但这在Django 1.10+中是不可能的.您使用a RequestContext作为第二个参数是不正确的 - 第二个参数应该是常规字典.
最后,请注意,当表单无效时,您不会返回响应.您可以通过稍微调整代码来解决此问题:
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
...
return HttpResponseRedirect('/register_success/')
else:
form = RegistrationForm()
return render(request, 'registration/register.html', {'form': form})
Run Code Online (Sandbox Code Playgroud)