我有一个django模板,其中有一个form元素,其中包括一些输入文本编辑和一个submit按钮,还有一个带有DropzoneJS的用户avatar uploader。
问题是我不能把DropzonJs
放在表单的div中,因为它会引发csrf_token error
。当我把一个csrf_token
放在我的div
中时,没有任何变化。我发现dropzoneJS;
只适用于csrf_token
表单元素。
这是我的模板:
<form role="form" method="POST">
{% csrf_token %}
<h5>Edit Profile Details</h5>
<div class="content">
<h1>{{ username }}</h1>
<!-- My other fields here -->
<div class="m-b-sm">
<img alt="image" class="img-circle" src="{% static 'img/profile.jpg' %}" />
</div>
<!-- Here is the div that contains DropzoneJS -->
<div class="dropzone dropzone-previews" id="my-awesome-dropzone" action="">
{% csrf_token %}
</div>
</div>
<!-- ... -->
但我认为,如果我在表单中添加一个
HTML
,就不需要在其内部元素中添加其他{% csrf_token %}
。DropzoneJS使用的表单如下:
<form class="dropzone" action="{% url "test_avatar" %}" method="post" enctype="multipart/form-data" id="my-awesome-dropzone">
{% csrf_token %}
</form>
但由于嵌套
{% csrf_token %}
表单元素的错误,我无法在表单内使用此表单。我该怎么办?
最佳答案
您应该以编程方式创建dropzone实例,并将csrf_令牌附加到formData对象。
首先,将令牌存储在html中的javascript变量中:
(我自己使用PHP/Laravel,所以我不确定这是否会打印出令牌,但您可以得到这个想法….)
<script>
token = {% csrf_token %};
</script>
然后在javascript文件(或内联)中创建dropzone实例:
var myDropzone = new Dropzone(".dropzone", {
url: '/file/upload', // your test_avatar route here
sending: function(file, xhr, formData) {
formData.append("csrf_token", token);
// the first parameter should be the fieldname that django is looking for
// the second parameter being the token from the variable set in your html
},
});