Попытка сохранить несколько файлов в Django 2 Admin - PullRequest
0 голосов
/ 09 декабря 2018

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

Моя модель:

class Document(Model):
    document_id = models.AutoField(primary_key=True)
    document_state = models.IntegerField(choices=DOCUMENT_STATE, default=PRIVATE, verbose_name="state")
    documentType_id = models.ForeignKey(DocumentType, on_delete=models.CASCADE, verbose_name="document type", )
    created = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="date created")
    updated = models.DateTimeField(auto_now=True, editable=False, verbose_name="last update")
    storage_file_name = models.FileField('File name', upload_to=unique_file_path)
    thumb_storage = models.FileField(editable=False,)
    original_file_name = models.CharField(editable=False, max_length=200)
    computed_sha256 = models.CharField(editable=False, max_length=64)

Я создаюмое собственное поле в Администраторе документа, поэтому я добавил в поле ключевое слово «несколько».Поле для storage_file_name выглядит следующим образом на странице создания документа администратора:

<label class="required" for="id_storage_file_name">File name:</label>
    <input type="file" name="storage_file_name" multiple required id="id_storage_file_name" />

У меня есть это в save_model в классе DocumentAdmin:

def save_model(self, request, obj, form, change):
        logger.debug("save_model START")
        logger.debug("obj=%s, change=%s" % (obj, change))
        if (form.is_valid()):
            logger.debug("\tvalid form")
            logger.debug("form.cleaned_data=%s",form.cleaned_data)
            obj.metadata = form.cleaned_data['metadata']
        logger.debug("files=%s" % request.FILES.getlist('storage_file_name'))
        files = request.FILES.getlist('storage_file_name')
        for f in files:
            logger.debug("storing file=%s" % f)
            obj.storage_file_name = f
            super().save_model(request, obj, form, change)
        logger.debug("save_model END")

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

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

Спасибо!

Mark

PS После попытки разных подходов это наконец-то работает.Обратите внимание, что нет вызова super.save_model, что, по-видимому, является проблемой, основанной на документах django.

def save_model(self, request, obj, form, change):
    logger.debug("save_model START")
    logger.debug("obj=%s, change=%s" % (obj, change))
    if (form.is_valid()):
        logger.debug("\tvalid form")
        logger.debug("form.cleaned_data=%s",form.cleaned_data)
        logger.debug("files=%s" % request.FILES.getlist('storage_file_name'))
        files = request.FILES.getlist('storage_file_name')
        for f in files:
            logger.debug("storing file=%s" % f)
            obj2 = Document()
            obj2.storage_file_name = f
            obj2.metadata = form.cleaned_data['metadata']
            obj2.document_state = form.cleaned_data['document_state']
            obj2.documentType_id = form.cleaned_data['documentType_id']
            obj2.save()
    logger.debug("save_model END")

Поля metadata, document_state и documentType_id были в словаре form.cleaned_data.

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

Спасибо!

Отметить

1 Ответ

0 голосов
/ 10 декабря 2018

В методе save_model у вас есть параметр obj, который является сохраняемым / изменяемым объектом со страницы изменений администратора django.

С другой стороны, вы пытались сохранить несколько объектов модели.Таким образом, в цикле for тот же объект передавался в вызов super и обновлялся для других изображений.

В результате вы видели только последнее изображение, сохраняемое в базе данных.В вызове super не было ничего плохого.

def save_model(self, request, obj, form, change):
    ...
    for f in files:
        logger.debug("storing file=%s" % f)
        # same object getting updated.
        obj.storage_file_name = f
        super().save_model(request, obj, form, change)
    logger.debug("save_model END")

Так что вам нужно каждый раз создавать новый объект в цикле for, а затем сохранять его.

Надеюсь, это очистит ваши сомнения.

...