gpt4 book ai didi

Django - CSRF token 生成 - render_to_response 与渲染

转载 作者:行者123 更新时间:2023-12-04 17:44:16 25 4
gpt4 key购买 nike

我正在 Django 中尝试一个简单的用户注册表单。当我使用 render_to_response 时,没有生成 CSRF token

return render_to_response('registration/register.html', RequestContext(request, {'form': RegistrationForm()}))



其中,当我使用 render 时会生成 CSRF token

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()}))
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 %}

最佳答案

推荐的方法是使用 render而不是 render_to_response .代码更简单,CSRF token 将起作用,因为 render将使用请求上下文来呈现模板。

return render(request, 'registration/register.html', {'form': RegistrationForm()})

The docs recommend that you don't use render_to_response .在 Django 1.10 之前,您可以手动传递 RequestContext作为第三个参数,但这在 Django 1.10+ 中是不可能的。您正在使用 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})

关于Django - CSRF token 生成 - render_to_response 与渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41606754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com