У меня есть форма 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 и комментарий передаются как полезная нагрузка запроса.
2 ответа
В этой проблеме с GitHub предлагается включить учетные данные, чтобы файл cookie CSRF отправляется вместе с запросом.
fetch(url, {method: method, body: form_data, credentials: 'include'})
Я предполагаю, что вы используете AJAX для публикации формы. При публикации форм в Django с использованием AJAX вам необходимо добавить следующее в свой Javascript перед отправкой запроса AJAX:
$.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'));
}
}
});
Более подробную информацию можно найти на https://docs.djangoproject.com/en /1.10/ref/csrf/#ajax
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Обратите внимание, что JavaScript — это НЕ Java. Включите все теги, относящиеся к вашему вопросу: например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [стройный] и т. д.