在我了解we can make file uploads with ajax之前的几天。因此,我尝试构建一个应用程序,当用户填写表单的其他部分时上传所选文件。
我的应用有两种型号:
class Post(models.Model):
image = models.ImageField(...)
title = ...
desc = ...
class TempImg(models.Model):
image = models.ImageField(...)
posted_by = ...
posted_at = ...
用于制作帖子的表单,在这里你可以看到temp_image是隐藏的输入:
class PostForm(forms.ModelForm):
temp_image = forms.IntegerField(widget=forms.HiddenInput)
class Meta:
model = Post
当用户选择图像时,此javascript代码上传它并将返回的id值放入表单的temp_image字段:
// here is a function that gets csrftoken, [which is taken from docs
// https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax
csrftoken = ...
form = new FormData();
form.append("image", dataURLToBlob(resizedImgData));
form.append("csrftoken", csrftoken)
$.ajax({
url: '/upload/',
data: form,
processData: false,
contentType: false,
dataType: 'json',
type: 'POST',
beforeSend: function() {
$("#uploadingIndicator").show()
},
success: function(data){
$("#id_temp_image").val(data['id'])
$("#uploadingIndicator").hide();
}
});
对我来说一切似乎都没问题但是,我的视图总是返回403. CSRF验证错误。
任何人都可以知道我应该在哪里看?如果我找不到解决方案,我将使用csrf_exemt ......
答案 0 :(得分:2)
你应该使用
form.append("csrfmiddlewaretoken", csrftoken)
当您尝试form.append("csrftoken", csrftoken)