Django:有什么方法可以在不诉诸魔法的情况下更改 FileField 的“upload_to”属性?

2024-04-21

请参阅这篇博文 http://scottbarnham.com/blog/2007/07/31/uploading-images-to-a-dynamic-path-with-django/...它已经很旧了,所以也许事情已经改变了。但在我的实验中他们没有。为了改变模型字段FileFieldupload_to动态路径,您必须诉诸使用signals并创建自定义model fields。可恶的。我无法想象动态上传路径是一个如此特殊的用例,以至于标准 Django 框架没有解决它?我错过了什么吗?还有其他方法可以实现此目的吗?

本质上我想这样做:

def MyModel(models.Model):
    fileUpload = models.FileField(upload_to='media/', null=True, blank=True)

def save(self, **kwargs):
    # Retrieve the user's id/pk from their profile
    up = UserProfile.objects.get(email=self.email)

    # All their uploads go into their own directory
    self.file_image.upload_to = up.id

    super(MyModel, self).save()

然而,在我尝试过的 10 种不同实现中,Django 都讨厌它们。特别是对于这个,文件被上传到默认路径'media/'.

我尝试抓取模型表单的参数并将这些参数传递到字典对象中,创建 MyModel 对象,设置 MyModel.fileUpload.upload_to 参数,然后将字典复制到模型中并保存。不起作用。

我也尝试覆盖__init__方法,但你猜怎么着?这在对象创建的早期阶段,实际上并没有self.email尚未定义!所以那是行不通的。

有什么想法或者我必须遵循原始链接中概述的神秘解决方案吗?


所以实际上有一个相当简单的解决方案,在FileField场、upload_to关键字参数实际上可以将函数作为参数。您在中指定的函数upload_tokwarg 应该有这个签名。

def my_awesome_upload_function(instance, filename):
    """ this function has to return the location to upload the file """
 
     return os.path.join('/media/%s/' % instance.id, filename)

在这种情况下,instance是您的模型的实例,具有FileField, and filename是上传文件的文件名。因此,您的模型如上面的示例所示,将如下所示:

def MyModel(models.Model):
    fileUpload = models.FileField(upload_to=my_awesome_upload_function, null=True, blank=True)

如果这是有道理的,你现在可以改变my_awesome_upload_function根据您的偏好,给定模型实例和已上传文件的文件名,生成上传文件的路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django:有什么方法可以在不诉诸魔法的情况下更改 FileField 的“upload_to”属性? 的相关文章

随机推荐