我有以下模型包含FileField
,其中用户提供包含图片的zip文件。保存期间,此zip文件由名为process_zipfile()
的方法进行访问。
class Album(models.Model):
nom = models.CharField(max_length = 200)
added_by = models.ForeignKey(User, null=True, blank=True)
gallery = models.ForeignKey(Gallery, null=True, blank=True)
zip_file = models.FileField('image field .zip', upload_to=PHOTOLOGUE_DIR+"/temp",
help_text='Select a .zip file of images to upload into a new Gallery.')
class Meta:
ordering = ['nom']
def save(self, *args, **kwargs):
self.gallery = self.process_zipfile()
super(Album, self).save(*args, **kwargs)
def delete(self, *args, **kwargs):
photos = self.gallery.photos.all()
for photo in photos:
photo.delete()
self.gallery.delete()
super(Album, self).delete(*args, **kwargs)
def process_zipfile(self):
if os.path.isfile(self.zip_file.path):
......(creates gallery object and links the photos)
return gallery
除了gallery
创建的图库不填充字段process_zipfile()
(表单留空)之外,它的工作正常。我做错了什么?
此外,删除方法似乎不起作用,任何想法?
答案 0 :(得分:0)
我终于能够使用post_save
和pre_delete
来解决我的问题了:
def depacktage(sender, **kwargs):
obj = kwargs['instance']
obj.gallery = obj.process_zipfile()
obj.zip_file = None
post_save.disconnect(depacktage, sender=Album)
obj.save()
post_save.connect(depacktage, sender=Album)
def netoyage(sender, **kwargs):
obj = kwargs['instance']
if obj.gallery:
if obj.gallery.photos:
photos = obj.gallery.photos.all()
for photo in photos:
photo.delete()
gal = Gallery.objects.get(pk = obj.gallery.pk)
pre_delete.disconnect(netoyage, sender=Album)
gal.delete()
pre_delete.connect(netoyage, sender=Album)
pre_delete.connect(netoyage, sender=Album)
post_save.connect(depacktage, sender=Album)
答案 1 :(得分:0)
虽然这个问题已经有两年了,但我还是试图学习如何做类似的事情。
在保存模型或字段之前,上传的文件不会写入其永久位置,因此路径可能会产生误导。根据您的配置和文件大小,它通常位于RAM(如果小于2.5 MB)或tmp
目录中。详情见:
https://docs.djangoproject.com/en/dev/topics/http/file-uploads/#where-uploaded-data-is-stored
如果你需要获取文件的句柄,在保存模型之前,为了对它进行一些处理,你可以在字段上调用save
(它需要两个参数,文件名,以及表示其内容的File对象,请参阅:https://docs.djangoproject.com/en/1.2/ref/models/fields/#django.db.models.FieldFile.save)。
由于你将在save()中调用save(),你可能想要传递可选的save=False
(假设你在模型的某个地方调用save()
)
OP的解决方案有效,因为在保存模型后调用了post-save
处理程序,因此该文件存在于预期的位置。
备用解决方案:强制使用tmp文件处理程序处理文件,并获取tmp路径;实现自己的上传处理程序。