代码之家  ›  专栏  ›  技术社区  ›  Brian D

带文件上传的模型表单

  •  1
  • Brian D  · 技术社区  · 14 年前

    我试着在前端模拟Photologue应用程序的管理界面。为此,我在视图中创建了一些代码:

    def galleryuploader(request):
        GalleryFormSet = modelformset_factory(GalleryUpload)    
        if request.method == 'POST':
            formset = GalleryFormSet(request.POST, request.FILES)
            if formset.is_valid():
                formset.save()
                # do something. ... do what?
        else:
            formset = GalleryFormSet()
        return render_to_response("cms_helper/gallery_upload.html", {
            "formset": formset,
        })
    

    和模板:

    <form method="post" action="">
        {{ formset }} 
        <input type="submit" />
    </form>
    

    我用的是django的“ form from models “生成此前端窗体的方法。

    问题是:当我尝试上载一个文件(因为我正在将照片上载到照片库)并点击提交时,它返回一个表单错误,告诉我缺少一个必需的字段(文件)。

    我想我没有检查任何文件的要求,但即使我是,我不太清楚如何。这里有一些关于 file uploads

    如果您对如何使这个上传表单工作有任何建议,我将非常高兴听到他们。提前谢谢!

    1 回复  |  直到 14 年前
        1
  •  3
  •   Sam Dolan    14 年前

    enctype="multipart/form-data" 属性到窗体标记。你还需要对上传的文件做些实际的处理。下面是来自 django docs :

    from django.http import HttpResponseRedirect
    from django.shortcuts import render_to_response
    
    # Imaginary function to handle an uploaded file.
    from somewhere import handle_uploaded_file
    
    def upload_file(request):
        if request.method == 'POST':
            form = UploadFileForm(request.POST, request.FILES)
            if form.is_valid():
                # you'll need to loop through the uploaded files here.
                handle_uploaded_file(request.FILES['file'])
                return HttpResponseRedirect('/success/url/')
        else:
            form = UploadFileForm()
        return render_to_response('upload.html', {'form': form})
    
    def handle_uploaded_file(f):
        destination = open('some/file/name.txt', 'wb+')
        for chunk in f.chunks():
            destination.write(chunk)
        destination.close()