Несколько загрузок файлов Django - PullRequest
0 голосов
/ 17 мая 2018

Я создал форму для загрузки файлов на основе этого руководства:

Нужен минимальный пример загрузки файла Django

Я хочу изменить это, чтобы разрешить загрузку нескольких файлов. Я попробовал пару подходов без особой удачи. Любой совет приветствуется.

Форма загрузки

        <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 голосов
/ 18 мая 2018

Вы можете добавить атрибут «множественный» к файлу ввода в вашей форме.Вы управляете или сдвигаете, выбирая нужные файлы.

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

Тогда, по вашему мнению, вы можете использовать:

if request.method == 'POST':
    for file in request.FILES.getlist('files'):
        # do something with each file
0 голосов
/ 18 мая 2018

Вы можете сделать что-то вроде

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

0 голосов
/ 17 мая 2018

Я предполагаю, что вы хотите, чтобы несколько виджетов загрузки отображались на одной странице.Без дополнительных надстроек пользователь не сможет просто выбрать несколько изображений и загрузить их все одновременно.Если вы хотите, чтобы пользователь мог загружать 5 изображений на одной странице, вам потребуется 5 полей или виджетов для загрузки изображений.В настоящее время ваша форма будет иметь только один элемент.

Это можно сделать с помощью наборов форм.По сути, набор форм - это то, что позволяет вам отображать несколько экземпляров одной и той же формы на одной странице.Я реализовал именно то, что вы хотите сделать на моем сайте, с помощью базовых функций набора форм, и это хорошо работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...