Python 将_上载到动态生成的url以调用
我看过很多关于这个问题的帖子,但我并不真正了解如何解决它 我有这个模型:Python 将_上载到动态生成的url以调用,python,django,models,Python,Django,Models,我看过很多关于这个问题的帖子,但我并不真正了解如何解决它 我有这个模型: class Project(TimeStampedModel): name = models.TextField(max_length=100, default='no name') logo = models.ImageField() 我希望按照此模板将图像保存到media root: <name>/logo/<filename> 并使用: logo = models.Imag
class Project(TimeStampedModel):
name = models.TextField(max_length=100, default='no name')
logo = models.ImageField()
我希望按照此模板将图像保存到media root:
<name>/logo/<filename>
并使用:
logo = models.ImageField(upload_to=upload_to_project)
至少我有:/
但在这种情况下,如何传递论点呢?我想重新使用我的功能上传到其他子文件夹中,而不仅仅是logo
as:
<name>/logo/<filename>
<name>/history/<filename>
<name>/whatever/<filename>
def generic_upload_to(instance, filename, folder, attrname):
return os.path.join(getattr(instance, attrname), folder, filename)
/logo/
/历史/
/随便/
你知道我能做些什么吗?看起来(重读你的帖子,还不是100%清楚)你想要的是一份工作。好消息,这是Python的stdlib的一部分:
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")
)
请注意,此实现假定实例
具有名称
属性。。。如果要用作第一部分的实例属性也必须是可配置的,则您可以将上载\u重写为:
<name>/logo/<filename>
<name>/history/<filename>
<name>/whatever/<filename>
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")
)
如果您的模型中有多个FileField
或ImageField
,并且不想重复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")
)
这一论点将在哪里提供?我认为这是不可能的。我觉得应该在电话上传时提供。但事实上,这可能是不可能的。或者我应该改变我的策略。这是一个伟大的解决方案!