我已经阅读了有关使用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)
我在Document admin中创建了自己的字段,因此我在该字段中添加了“ multiple”关键字。在管理员创建文档页面中,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" />
我在DocumentAdmin类的save_model中拥有这个:
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")
files具有我要上传的文件的正确列表。但是我似乎无法保存比文件列表中的最后一项更多的内容。我没有收到任何错误消息;如果未上传所选文件,则仅列出列表中的前n张图像。
如果可以避免的话,我宁愿不要在我的应用程序中包含许多django-multiple-file-upload应用程序之一。我宁愿明白我在做什么错并予以解决!
谢谢!
标记
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")
元数据字段,document_state和documentType_id都在form.cleaned_data字典中。
这是上传多个文件的首选方法吗?
谢谢!
标记
答案 0 :(得分:0)
在方法save_model
中,您具有obj参数,它是django admin更改页面上要保存/更改的对象。
另一方面,您尝试保存模型的多个对象。因此,在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循环中创建一个新对象,然后将其保存。
希望它消除了您的疑问。