Django初学者,我一直试图解决这个问题很长一段时间。 我的中间件类中有'django.middleware.csrf.CsrfViewMiddleware',我的帖子中有令牌。
继承我的代码,我做错了什么?
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from chartsey.authentication.forms import RegistrationForm
from django.template import RequestContext
from django.core.context_processors import csrf
def register(request):
if request.method == 'POST':
c = RequestContext(request.POST, {})
form = RegistrationForm(c)
if form.is_valid():
new_user = form.save()
return HttpResponseRedirect("/")
else:
form = RegistrationForm()
return render_to_response("register.html", {'form': form, }, )
这是我的模板:
{% block content %}
<h1>Register</h1>
<form action="" method="POST"> {% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit">
</form>
{% endblock %}
答案 0 :(得分:23)
这些天你应该使用自动使用render
的{{1}}快捷方式功能return render(request, 'template.html')
,以便下面的建议过时8年。
RequestContext
https://docs.djangoproject.com/en/2.2/topics/http/shortcuts/ render
模板标记我的猜测是你在模板中有标签,但它没有呈现任何内容(或者你的意思是你在实际的HTML中确认正在生成CSRF令牌?)
使用{% csrf_token %}
代替字典
RequestContext
或确保render_to_response("foo.html", RequestContext(request, {}))
设置中有django.core.context_processors.csrf
。
答案 1 :(得分:6)
只需将此添加到您的观看次数
即可 return render_to_response("register.html", {'form': form, }, context_instance = RequestContext(request))
它会起作用!!
答案 2 :(得分:4)
尝试使用呈现而不是 render_to_response :
from django.shortcuts import render
render(request, "foo.html", {})
Django - what is the difference between render(), render_to_response() and direct_to_template()?
如上面的链接所述,它在Django 1.3中引入并自动使用 RequestContext
答案 3 :(得分:0)
如果您不使用CsrfViewMiddleware,则必须在使用csrf_token模板标记的任何视图以及接受POST数据的视图上使用csrf_protect。
答案 4 :(得分:0)
使用RequestContext
时,添加render_to_response
是@Yuji&#39; Tomita&#39; Tomita和@Njogu Mbau。但是,当我遇到这个问题时最初让我失望的是,我必须将RequestContext
添加到views.py
中最初加载模板的函数和views.py
中的函数处理模板提交的内容。
另外,仅供参考,以下是讨论同样问题的其他一些链接
答案 5 :(得分:0)
安装django-livereload-server后,在某些页面上也随机出现此错误。卸载django-livereload-server就可以了。
答案 6 :(得分:0)
我也遇到了这个问题,但是老实说,几分钟后,我在浏览器上单击了刷新,而没有进行任何更改,并且在那个时候起作用了。我在命令行中收到了此消息,因此它可以提供有关导致问题的原因的线索:
Not Found: /css/reset/reset.css
[03/Jul/2020 20:52:13] "GET /css/reset/reset.css HTTP/......
答案 7 :(得分:0)
const url = "{% url 'YOUR_URL_NAME' pk=12345 %}".replace(/12345/, id.toString());
$.ajax({
type: 'POST',
url: url,
data: {'id':id, "csrfmiddlewaretoken": '{{csrf_token}}'},
beforeSend: function() { $('#response').text('Please wait ...'); },
success: function (response) {
console.log(response)
},
error: function (response) {
console.log(response)
}
})
希望它会奏效!!!
答案 8 :(得分:-1)
对我来说有用的是从我的settings.py
'django.middleware.csrf.CsrfViewMiddleware'