2013-04-22 84 views
1

几天之后,我才知道we can make file uploads with ajax。所以我试图建立一个应用程序,当用户填写表单的其他部分时,上传选定的文件。尝试使用ajax上传文件时,CSRF保护始终失败

我的应用程序有两种型号:

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

http://stackoverflow.com/的可能的复制questions/10562494/csrf-with-ajax-and-django-post?rq = 1? – 2013-04-22 19:35:13

回答

2

您应该使用

form.append("csrfmiddlewaretoken", csrftoken) 

当你试图做form.append("csrftoken", csrftoken)