多个文件上传Django

时间:2018-05-17 18:09:59

标签: python django upload

我已根据本指南创建了一个上传文件的表单:

Need a minimal Django file upload example

我想调整它以允许多个文件上传。我尝试了几种没有太多运气的方法。任何建议表示赞赏。

上传表单

        <form action="{% url 'list' %}" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <p>{{ form.non_field_errors }}</p>
        <p>{{ form.docfile.label_tag }} {{ form.docfile.help_text }}</p>
        <p>
            {{ form.docfile.errors }}
            {{ form.docfile }}
        </p>
        <p><input type="submit" value="Upload" /></p>
    </form>

views.py

def list(request):
if request.method == 'POST':
    form = DocumentForm(request.POST, request.FILES)
    if form.is_valid():
        newdoc = Document(docfile=request.FILES['docfile'])
        newdoc.save()

        return HttpResponseRedirect(reverse('list'))
else:
    form = DocumentForm()  # A empty, unbound form

documents = Document.objects.all()

return render(
    request,
    'check/list.html',
    {'documents': documents, 'form': form}
)

forms.py

class DocumentForm(forms.Form):
docfile = forms.FileField(
    label='Select a file',
    help_text='max. 42 megabytes',
)

3 个答案:

答案 0 :(得分:1)

您可以添加多个&#39;属性为表单中的文件输入。您可以控制或转移选择所需的文件。

<input type="file" name="files" multiple />

然后在您的视图中,您可以使用:

if request.method == 'POST':
    for file in request.FILES.getlist('files'):
        # do something with each file

答案 1 :(得分:0)

我假设您希望在一个页面上显示多个上传小部件。如果没有其他附加组件,用户将无法同时选择多个图像并上传所有图像。如果您希望用户能够在同一页面上传5张图片,则您必须拥有5张图片上传字段或小部件。目前,您的表单只有一个。

这可以使用formset来完成。从本质上讲,formset是允许您在同一页面上显示同一表单的多个实例的东西。

阅读formsets,如果您对此有任何疑问,请告诉我们。我已经使用基本的formset功能准确地实现了您在我的网站上想要做的事情,而且效果很好。

答案 2 :(得分:0)

您可以执行类似

的操作
  

forms.py

from django import forms

class FileFieldForm(forms.Form):
    file_field = forms.FileField(
         widget=forms.ClearableFileInput(attrs={'multiple': True}))
  

views.py

from django.views.generic.edit import FormView
from .forms import FileFieldForm

class FileFieldView(FormView):
    form_class = FileFieldForm
    template_name = 'upload.html'  # Replace with your template.
    success_url = '...'  # Replace with your URL or reverse().

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('file_field')
        if form.is_valid():
            for f in files:
                ...  # Do something with each file.
            return self.form_valid(form)
        else:
            return self.form_invalid(form)


参考:https://docs.djangoproject.com/en/2.0/topics/http/file-uploads/#uploading-multiple-files