Django表单上传request.files为空 [英] Django form upload request.files empty

查看:34
本文介绍了Django表单上传request.files为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我以前没有在这里发布问题,大部分已读过.

I havent posted a question here before, read mostly.

我正在学习Django,并且之前可以进行文件上传.但是现在我已经以某种方式打破了它.

Im learning Django and got file upload working before . But now i've broke it somehow.

request.FILES为空,但我可以在request.raw_post_data中看到文件名.

request.FILES is empty when im uploading but i can see the filename in 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)

推荐答案

使用ModelForms可以轻松完成您要执行的操作:

It would be much easier to do what you're trying to do using 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

这篇关于Django表单上传request.files为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆