Django使用实例.id上传imag时

2024-03-29 07:36:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我指的是youtube video,目的是了解如何使用ImageField上传图像。他解释了如何在保存图像时使用instance.id。我试过了,但是instance.id返回{}。而对他来说,这是完美的。代码如下:

#models.py
import os

def get_image_path(instance, filename):
    return os.path.join(str(instance.id), filename)

class AdProfile(models.Model):
    name = models.CharField(max_length=100)
    profile_image = models.ImageField(upload_to=get_image_path, blank=True, null=True)

每当文件被保存时,其保存为None/filename。在

即使是这个link也说明了这一点。我使用的是django10.5和MySQL数据库。在

有什么问题吗?在


Tags: pathinstance代码图像image目的idtrue
2条回答

使用rajasimon的答案,有一个方法来处理模型中的所有FileField

class MyModel(models.Model):

    file_field = models.FileField(upload_to=upload_to, blank=True, null=True)

    def save(self, *args, **kwargs):
        if self.id is None:
            saved = []
            for f in self.__class__._meta.get_fields():
                if isinstance(f, models.FileField):
                    saved.append((f.name, getattr(self, f.name)))
                    setattr(self, f.name, None)

            super(self.__class__, self).save(*args, **kwargs)

            for name, val in saved:
                setattr(self, name, val)
        super(self.__class__, self).save(*args, **kwargs)

此外,我们可以使文件位置动态化,即不仅基于自身id,但也在外键的id上。只需迭代字段并检查路径是否已更改。在

^{pr2}$

Django admin以某种方式调用了get_image_path函数,但没有将模型保存到数据库中,因此id为None。我们可以使用save方法重写django模型,并确保图像已保存,get_image_path获取id为的实例

class AdProfile(models.Model):
    name = models.CharField(max_length=100)
    profile_image = models.ImageField(upload_to=get_image_path, blank=True, null=True)

    # Model Save override 
    def save(self, *args, **kwargs):
        if self.id is None:
            saved_image = self.profile_image
            self.profile_image = None
            super(AdProfile, self).save(*args, **kwargs)
            self.profile_image = saved_image
            if 'force_insert' in kwargs:
                kwargs.pop('force_insert')

        super(AdProfile, self).save(*args, **kwargs)

相关问题 更多 >