我有一个html表单,如:
<form id="comment" action="{% url "url_name" ur.id %}" method="post">{% csrf_token %}
<textarea required="required" maxlength="255" rows="4" class="form-control" name="comment">
</textarea>
<button class="btn btn-default" onclick="add_comment(event)">Comment</button>
</form>
这是一个html表单,而不是django's
表单。
我在表格中加入了csrf token
。我已经发布此表单形式的javascript,现在它给了我csrf verification failed
错误。
我在这里缺少什么?是否必须从django'表单类创建表单以使用csrf令牌?
需要帮助
我的js看起来像:
function add_comment(event) {
event.preventDefault()
var form = document.getElementById('comment')
var url = form.action
var method = form.method
var form_data = new FormData(form)
fetch(url, {method: method, body: form_data})
}
我只是从我的django视图中渲染模板
当我看到请求网络时,csrf令牌和注释作为请求有效负载传递..
答案 0 :(得分:2)
此GitHub issue表示您必须包含凭据,以便随请求一起发送CSRF Cookie。
fetch(url, {method: method, body: form_data, credentials: 'include'})
答案 1 :(得分:0)
我假设您正在使用AJAX发布表单。使用AJAX使用Django发布表单时,您需要在提交AJAX请求之前将以下内容添加到Javascript中:
$.ajaxSetup({
beforeSend: function(xhr, settings) {
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
// Only send the token to relative URLs i.e. locally.
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
}
}
});
找到更多信息