Я прочитал различные посты о сохранении нескольких файлов с помощью администратора 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.
Является ли это предпочтительным способом загрузки нескольких файлов?
Спасибо!
Отметить