2011-09-02 71 views
5

我之前沒有在這裏發過一個問題,主要是閱讀。Django表單上傳request.files空

我學習Django並獲得文件上傳工作。但是現在我已經打破了它。

當im上傳時request.FILES爲空,但我可以在request.raw_post_data中看到文件名。

這裏是關於HTML

<form enctype="multipart/form-data" method="post" action="">{% csrf_token %} 
{{ form.as_p }} 
<input type="submit" name="submit" value="Upload Photo" /> 
</form 

形式的代碼

class PhotoUploadForm(forms.Form): 
    title = forms.CharField(max_length=50) 
    description = forms.CharField(required=False,max_length="254") 
    photo = forms.ImageField() 

視圖

class PhotoUploadView(FormView): 

    template_name ="album/photo_upload.html" 
    form_class = PhotoUploadForm 

    def get_context_data(self,**kwargs): 
     context = super(PhotoUploadView,self).get_context_data(**kwargs) 
     context['user_info'] = self.request.user 
     if 'upload_form' in kwargs: 
      context['upload_form'] = kwargs['upload_form'] 
     else: 
      context['upload_form'] = PhotoUploadForm() 
     album = get_object_or_404(Album,id=self.kwargs['album_id']) 
     context['album'] = album 
     context['form'] = self.form_class 
     return context 

    def post(self,*args,**kwargs): 
     print self.request.FILES 
     print self.request.raw_post_data 
     if self.request.method == "POST": 
      form = PhotoUploadForm(self.request.POST,self.request.FILES) 
      if form.is_valid(): 
       photo = Photo() 
       photo.title = form.cleaned_data['title'] 
       photo.summary = form.cleaned_data['description'] 
       photo.album = get_object_or_404(Album,id = kwargs['album_id']) 
       photo.is_cover_photo = True     
       path = self.generate_filename(self.request.FILES['photo'].name,self.request.user,kwargs['album_id']) 
       destination = open(path,"wb+") 
       for chunk in self.request.FILES['photo'].chunks(): 
        destination.write(chunk) 
       destination.close() 
       photo.imagePath = path 
       photo.save() 
     return self.render_to_response(self.get_context_data(upload_form=form) 

回答

0

這將是很容易做你想要做的使用ModelForms什麼:

#forms.py 
class PhotoAddForm(forms.ModelForm): 
    class Meta: 
     model = Photo 

    def __init__(self, album_id, *args, **kwargs): 
     self.album_id = album_id 
     super(PhotoAddForm, self).__init__(*args, **kwargs) 

    def save(self, commit=True): 
     photo = super(PhotoAddForm, self).save(commit=False) 
     photo.album_id = self.album_id 
     if commit: 
      photo.save() 
     return photo 

#views.py 
class AddPhotoView(CreateView): 
    form_class = PhotoAddForm 
    template_name = 'photos/add_photo.html' 

    def get_success_url(self): 
     return reverse('photo_add_successful') 

    def get_form_kwargs(self): 
     kwargs = super(AddPhotoView, self).get_form_kwargs() 
     kwargs.update({ 
      'album_id': self.kwargs['album_id'], 
     }) 
     return kwargs 
+0

的模板哦謝謝,看看模型,它看起來很漂亮。不重複。我是否應該改變它,然後編輯我的主帖以方便閱讀? – Ludvig

+0

它認爲你應該離開這個職位,所以人們有問題和答案的背景。 –

4

我做到了使用FormView控件太(我主要是學習如何使用它,最新的通用的Django文檔班級觀點相當有限);而@bezidejni的答案可能是一個更好的解決方案,這是你如何得到它的工作WRT你的問題:

class PhotoUploadView(FormView): 

    template_name ="album/photo_upload.html" 
    form_class = PhotoUploadForm 

    def form_valid(self, form): 
     """ 
     This is what's called when the form is valid. 
     """ 
     photo = form.cleaned_data['photo'] # <= this is your uploaded file in memory 
     # read your photo object by chunks, save it to disk, or whatever else 
     # .... 
     # then keep on going! you can make the 'get_success_url' more complex should you need to. 
     return HttpResponseRedirect(self.get_success_url()) 

PS。 如果您使用FormView,則不應使用render_to_response;過載get_context_data如果您需要將上下文傳遞給已指定爲template_name

+0

感謝您向我展示如何使用formview! – Ludvig

+1

我瞭解ModelForm方法,但這很簡單快捷。很明顯(: –