У меня есть форма 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 и комментарий передаются как полезная нагрузка запроса.

1
varad 28 Фев 2017 в 19:35

2 ответа

Лучший ответ

В этой проблеме с GitHub предлагается включить учетные данные, чтобы файл cookie CSRF отправляется вместе с запросом.

fetch(url, {method: method, body: form_data, credentials: 'include'})
2
Alasdair 28 Фев 2017 в 17:09

Я предполагаю, что вы используете 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

0
tdsymonds 28 Фев 2017 в 16:41