Джанго как загрузить папку

Я знаю, как загружать несколько файлов через django, но у меня возникает проблема при загрузке папки, если в ней есть подпапки. Джанго не может получать подпапки. Я нашел причину, потому что браузер использует '.' для представления папки, но django не может ее разобрать, а затем прекратить разбор. Есть ли элегантный способ исправить это?

код питона:

def uploader_single(request):
    data = {}
    if request.method == 'POST':
        if True:
            for afile in request.FILES.getlist('file'):
                new_file = UploadFileSingle(file = afile)
                new_file.save()

            return HttpResponseRedirect('')
        else:
            print "form is not valid"
            return HttpResponseRedirect('')
    else:
        print 'not post'

Код Python:

class UploadFileSingle(models.Model):
    file        = models.FileField(upload_to='files/%Y/%m/%d', models.FilePath)
    uploaded_at = models.DateTimeField(auto_now_add=True)
    models.FilePathField.recursive = True
    models.FilePathField.allow_folders = True
    updated_at  = models.DateTimeField(auto_now=True)

    def some_folder = FilePathField(path='some_path', recursive=True, allow_files=True, allow_folders=True,)'

HTML-код:

<input type="file" name="file" multiple = "true" webkitdirectory="true" directory = "true"/>

person Tengerye    schedule 10.02.2014    source источник


Ответы (3)


Есть более новая тема, которая задает тот же вопрос, и я попытался ответить:

Загрузка каталога Django и получение имен подкаталогов

По сути, это поведение Django по умолчанию, если вы хотите иметь другое поведение, вам нужно написать свои собственные обработчики загрузки.

person Gagik Sukiasyan    schedule 25.11.2016

Я придумал простое решение этой проблемы.

  • Вы можете получить имя папки через html и javascript во внешнем интерфейсе.
  • передать его как значение скрытому полю формы
  • в бэкэнде вы можете создать каталог с таким именем
  • и загрузите файлы в этот каталог.

HTML

<input type="hidden" name="dir_name" id="id_dir_name">
<input type="file" name="file" onchange="selectFolder(event)" webkitdirectory="" multiple="" required="" directory="" id="id_file">

JS

function selectFolder(e) {
    var theFiles = e.target.files;
    var relativePath = theFiles[0].webkitRelativePath;
    var folder = relativePath.split("/");
    $("#" + id).val(folder[0]);
}

просмотры

directory_name = form.cleaned_data['dir_name']
os.mkdir(os.path.join(settings.MEDIA_ROOT, directory_name))
handle_uploaded_file(request.FILES['file'], directory_name)
person Ali Kompany    schedule 13.01.2019
comment
Гораздо более рекомендуется писать собственные обработчики загрузки. - person Stack; 24.09.2020

вы можете использовать файл django

ссылка: https://github.com/stefanfoulis/django-filer

person Avinash Garg    schedule 11.02.2014
comment
Большое спасибо. Но не могли бы вы объяснить, как я могу точно применить фильтр к моему делу? Спасибо. - person Tengerye; 14.02.2014
comment
Фильтр Джанго не может этого сделать. Мой вывод: django еще не может этого сделать. - person Tengerye; 02.05.2014
comment
Ничего общего с вопросом - person Gagik Sukiasyan; 07.12.2016