gpt4 book ai didi

python - upload_to 动态生成可调用的 url

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:52 25 4
gpt4 key购买 nike

我看过很多关于这个问题的帖子,但并没有真正理解如何解决它。

我有这个模型:

class Project(TimeStampedModel):
name = models.TextField(max_length=100, default='no name')
logo = models.ImageField()

我想按照此模板将我的图像保存到媒体根目录:

<name>/logo/<filename>

乍一看,我想做的是:

logo = models.ImageField(upload_to="{}/logo/".format(name))

但它引发了这个错误:AttributeError: 'TextField' object has no attribute 'model'

使用可调用对象会很好,但有部分原因:

def upload_to_project(self, filename):
url = ("%s/%s") % (self.name, filename)
return url

并使用:

logo = models.ImageField(upload_to=upload_to_project)

至少我有:<name>/<filename>

但是在这种情况下如何传递参数呢?我想重用我的功能在其他子文件夹中上传,而不仅仅是 logo作为:

<name>/logo/<filename>
<name>/history/<filename>
<name>/whatever/<filename>

知道我能做什么吗?

最佳答案

看起来(重新阅读您的帖子,它不是 100% 清楚)您想要的是 partial application .好消息,它是 Python 标准库的一部分:

import os
from functools import partial

def generic_upload_to(instance, filename, folder):
return os.path.join(instance.name, folder, filename)


class Project(TimeStampedModel):
name = models.TextField(max_length=100, default='no name')
logo = models.ImageField(
upload_to=partial(generic_upload_to, folder="logo")
)

请注意,此实现假定 instance 具有 name 属性...如果您想要用作第一部分的实例属性也必须是可配置的,您可以重写您的upload_to 为:

def generic_upload_to(instance, filename, folder, attrname):
return os.path.join(getattr(instance, attrname), folder, filename)

然后将其用作

class Project(TimeStampedModel):
name = models.TextField(max_length=100, default='no name')
logo = models.ImageField(
upload_to=partial(generic_upload_to, attrname="name", folder="logo")
)

如果您的模型中有多个 FileFieldImageField 并且不想重复 attrname 部分:

class Something(TimeStampedModel):
my_upload_to = partial(generic_upload_to, attrname="label")

label = models.CharField(max_length=100, default='no label')
logo = models.ImageField(
upload_to=partial(my_upload_to, folder="logo")
)
attachment = models.FileField(
upload_to=partial(my_upload_to, folder="attachment")
)

关于python - upload_to 动态生成可调用的 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30843234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com