Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多文件上传Django_Python_Django_Upload - Fatal编程技术网

Python 多文件上传Django

Python 多文件上传Django,python,django,upload,Python,Django,Upload,我已根据本指南创建了一个上传文件的表单: 我想调整它以允许多个文件上传。我尝试过几种方法,但运气不太好。谢谢你的建议 上传表单 <form action="{% url 'list' %}" method="post" enctype="multipart/form-data"> {% csrf_token %} <p>{{ form.non_field_errors }}</p> <p&g

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

我想调整它以允许多个文件上传。我尝试过几种方法,但运气不太好。谢谢你的建议

上传表单

        <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>
forms.py

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

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

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


请阅读表单集,如果您对此有任何疑问,请告知我们。我已经用基本的表单集功能实现了您在我的网站上想要做的事情,效果很好。

您可以在表单中的文件输入中添加“multiple”属性。您可以控制或按住shift键选择所需的文件

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

你可以这样做

forms.py

class DocumentForm(forms.Form):
docfile = forms.FileField(
    label='Select a file',
    help_text='max. 42 megabytes',
)
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}
)

参考资料:

谢谢。这似乎奏效了。我好像把文件放在“文件”里了。现在我只需要解决如何将它们写入磁盘。非常感谢。
from django import forms

class FileFieldForm(forms.Form):
    file_field = forms.FileField(
         widget=forms.ClearableFileInput(attrs={'multiple': True}))
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)