Django:在save()期间填充字段

时间:2011-03-15 16:33:43

标签: django django-models django-admin

我有以下模型包含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()(表单留空)之外,它的工作正常。我做错了什么?

此外,删除方法似乎不起作用,任何想法?

2 个答案:

答案 0 :(得分:0)

我终于能够使用post_savepre_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路径;实现自己的上传处理程序。