javascript post django form给出了csrf错误

时间:2017-02-28 16:35:14

标签: javascript django forms

我有一个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 个答案:

答案 0 :(得分:2)

GitHub issue表示您必须包含凭据,以便随请求一起发送CSRF Coo​​kie。

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'));
        }
    } 
});

可以在https://docs.djangoproject.com/en/1.10/ref/csrf/#ajax

找到更多信息