【问题标题】:How to properly append django csrf_token to form in inline javascript?如何正确附加 django csrf_token 以在内联 javascript 中形成?
【发布时间】:2017-08-01 16:56:29
【问题描述】:

我已经在 javascript 中动态创建了表单元素:

var selectform = document.createElement("form")

我在 selectform 中添加了其他输入元素和这些属性:

   submitnselection.setAttribute('type',"submit");
   submitnselection.setAttribute('value',"Submit");
   submitnselection.setAttribute("name","submitnpage");
   selectform.setAttribute("method", "post")
   selectform.setAttribute = ("action", "/test")
   "{% csrf_token %}";

在 HTML 中,添加 {% csrf_token %} 模板标签会起作用,但在这种 javascript 的情况下,我得到了 403 禁止错误:

CSRF 令牌丢失或不正确。

我找到了一些解决方案,但没有什么对我有用,有没有办法添加 {% csrf_token %} 以仅使用 Django、Javascript 和纯 Jquery 形成?另请注意,此脚本在 html 中,所以我认为 {% csrf_token %} 模板标签会起作用。

【问题讨论】:

    标签: javascript jquery html django


    【解决方案1】:

    这应该可行:

    var inputElem = document.createElement('input');
    inputElem.type = 'hidden';
    inputElem.name = 'csrfmiddlewaretoken';
    inputElem.value = '{{ csrf_token }}';
    selectform.appendChild(inputElem);
    

    你看,csrf_token 只不过是一个字符串,它是表单的hidden 输入元素的value。就是这样!

    【讨论】:

    • 您好,感谢您的回答,现在提交按钮将完全消失,但输入值时我仍然会收到相同的 403 错误。
    • 是的。因为我覆盖了提交按钮。我的错。更新答案来了...
    • 由于某种原因它给了我syntaxerror,@chirilov 的解决方案也是如此。
    • 发现它在 value 属性上给了我错误:inputElem.value = '{% csrf_token %}'; 但我不知道确切的原因。
    • 工作得很好,我看到了一些关于这些错误的问题,我认为 {% csrf_token %} 自动创建元素本身,无论如何,谢谢!
    【解决方案2】:

    您可以尝试在表单中附加一个输入字段:

    // declare an input field 
    var input = document.createElement('input');
    input.type = 'hidden';
    input.name = 'csrfmiddlewaretoken';
    input.value = '{% csrf_token %}';
    
    // attach field to the form 
    selectform.appendChild(input);
    
    // submit
    

    【讨论】:

    • 由于某种原因,它给了我语法错误,Uncaught SyntaxError: Unexpected identifier
    • 发现它在 value 属性上给了我错误,但我不知道原因。
    • 奇怪,请访问 findle 上的建议代码:link,希望对您有所帮助
    • Fiddle 可以工作,但是当我尝试将值更改为 {% csrf_token %} 时,我又遇到了那个错误。
    • JavaScript 代码没有被 Django 预处理。项目 {% csrf_token %} 在向客户端发送响应之前由 django 扩展。您正在客户端执行 javascript。如果您从头构建表单 [ 我在您的代码中看到您是 ] input.value 必须填充 django 消耗的 csrfmiddlewaretoken 的值。填充 input.value = $( "input[name='csrfmiddlewaretoken']" ).val() 的值这应该可以工作
    【解决方案3】:

    如果我明白了一切,你需要发送一个 csrf 令牌,但你没有任何东西可以从 javascript 发送到服务器。

    从 Django 模板中的代码很容易生成带有通常 {% csrf_token %} Django 标记的 csrf 令牌,但这是因为模板正在服务器中处理以创建最终的 HTML,该 HTML 将被发送到浏览器。

    当您使用 Javascript 时,您无法生成 csrf 令牌,因此,我认为最好的解决方案是在模板中创建一个不可见的标签,可能是隐藏的输入。

    <input id="token" type="hidden" value="{% csrf_token %}" ></input>
    

    当在 jQuery 中使用 $('#token').attr('value') 获取值时,我有一个使用 jQuery POST 方法的示例:

    token = $('#token').attr('value');
    $.post(url, { 
                 'personId': personId,
                 'csrfmiddlewaretoken': token // This is the important thing
                }, function() {}
    );
    

    无论您如何操作,您都必须发送带有“csrfmiddlewaretoken”名称的令牌和令牌值以及您想要发送到服务器的其他信息。

    如果您需要,我正在使用纯 JS 解决方案进行编辑。直说吧。

    【讨论】:

    • 感谢您的回答,我想我已经找到了这种解决方案,但如果有的话,我正在尝试找到类似于 HTML 的更简单、更简单的解决方案。
    猜你喜欢
    • 2016-04-05
    • 2019-06-21
    • 2014-09-23
    • 1970-01-01
    • 2016-07-29
    • 2013-07-19
    • 2012-01-11
    • 1970-01-01
    • 2014-06-14
    相关资源
    最近更新 更多