Одновременная загрузка нескольких файлов — Django

#python #django #django-models #django-views #django-forms

#python #django #django-модели #django-просмотры #django-формы

Вопрос:

Я следую пути, показанному ниже, и все кажется нормальным. Но проблема в том, что я загружаю больше, чем файлы фотографий (удерживая ctrl ), но на самом деле загружается только один из них. Вот мои коды:

views.py :

 def school_document(request):
    if request.method == 'POST':
        form = CreateSchoolDocumentForm(request.POST, request.FILES, use_required_attribute=False)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('school_document')
    else:
        form = CreateSchoolDocumentForm(use_required_attribute=False)
    context = {
        'form': form
    }
    return render(request, 'school_document.html', context)
 

forms.py :

 ...
    class Meta:
        model = SchoolDocument
        fields = '__all__'
        widgets = {
            'photos': ClearableFileInput(attrs={'multiple': True}),
        }
 

school_document.html :

 <form class="form-container" method='POST' enctype="multipart/form-data" style="height: auto;">
...
</form>
 

models.py :

 class SchoolDocument(models.Model):
    apply_date = models.DateTimeField(_('Müraciət tarixi'))
    ...
    photos = models.FileField(upload_to='static/school_documents/', blank=True, null=True)

    def __str__(self):
        return str(self.apply_date)
 

Комментарии:

1. Пожалуйста, покажите свою модель

2. @ha-neul, добавлено.

Ответ №1:

Это обновленный ответ. У вас SchoolDocument есть несколько полей плюс photo поле. Когда вы устанавливаете свою модель таким образом, фотополе сможет принимать только один файл.

Что вам нужно сделать, так это создать отдельную Photo модель и ForeignKey для вашей SchoolDocument модели.

 class SchoolDocument(models.Model):
    apply_date = models.DateTimeField(_('Müraciət tarixi'))
    ...
    

    def __str__(self):
        return str(self.apply_date)


class Photo(models.Model):
    schooldocument = models.ForeignKey(SchoolDocument, ........)
    image = models.FileField(upload_to='static/school_documents/', blank=True, null=True)

 

В вашем forms.py , вы добавите еще одно поле (filefield) в свою форму SchoolDocument с настройкой виджета «несколько файлов».

и в views.py , вы сохраните индивидуальный файл в вашей Photo модели

 files = request.FILES.getlist('image')

for f in files:
    photo = Photo(schooldocument=schooldocument, image=f)
    photo.save()
    
    # Do something about each f
 

Комментарии:

1. Я нашел ответ, похожий на ваш, в документации Django, но не знаю, что это # Do something about each f значит. Что мне там делать, просто для сохранения их в базе данных?

2. Запишите каждый отдельный файл в базу данных.

3. @MikeStoddart, можете ли вы объяснить это на примере кода? Я действительно не знаю, что делать.

4. Я не работал с загрузкой файлов со времен Django 1.x, поэтому моя память туманна. Но очень быстрый взгляд на документацию по загрузке файлов Django показывает: instance = ModelWithFileField(file_field=f) instance.save()

5. Снова обновлено, что делать с файлами