动态创建的表单在 django rest 框架上总是被 403 禁止 api POST

Form created dynamically always gets 403 forbidden on a django rest framework api POST

我的网站上有多个文本 post。单击编辑按钮后,我动态创建了一个表单,将 div 替换为表单元素。我在 django 端设置了 POST api 以提交此表单并编辑现有的 post。但是我的 POST 请求总是得到 403。首先我假设没有 csrf 令牌是导致问题的原因。所以我将我的 js 代码编辑为这个-

                    //form create
                    const post_content_element = post.querySelector('div .text-content');
                    const post_content = post_content_element.innerHTML;

                    let edit_form = document.createElement('form');

                    // Here I added the csrf token as a hidden input 
                    let inputElem = document.createElement('input');
                    inputElem.type = 'hidden';
                    inputElem.name = 'csrfmiddlewaretoken';
                    inputElem.value = '{{ csrf_token }}';
                    edit_form.appendChild(inputElem);

                    edit_form.setAttribute('id', 'edit-form');
                    edit_form.setAttribute('method', 'POST');

                    let text_content = document.createElement('input');
                    text_content.setAttribute('type', 'textarea');
                    text_content.setAttribute('id', 'edit-content');
                    text_content.value = post_content;

                    let submit = document.createElement('input');
                    submit.setAttribute('type', 'submit');
                    submit.setAttribute('id', 'edit-submit');

                    edit_form.appendChild(text_content);
                    edit_form.appendChild(submit);

它仍然被 403 禁止。我的 api 看起来像这样-

@api_view(['POST'])
def edit_post(request):
    if request.method == "POST":
        # do something
        return Response(status=status.HTTP_201_CREATED)

请注意,我正在使用我的用户 (AbstractUser) 模型进行身份验证。我没主意了。此问题的其他原因可能是什么?

我通过阅读这篇文章解决了我的问题- https://docs.djangoproject.com/en/1.11/ref/csrf/#ajax

getCookie 函数如上页所示

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

然后我用 X-CSRFToken header 写了 POST 请求,如下所示-

fetch(window.location.origin.concat('<url>'), {
                            method:'POST',

                            credentials: 'same-origin',
                            headers: {
                                "Content-Type": "application/json",
                                "X-CSRFToken": getCookie("csrftoken")
                            },
                           body: <whatever body you have>
                           })