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")
        )

这一论点将在哪里提供?我认为这是不可能的。我觉得应该在电话上传时提供。但事实上,这可能是不可能的。或者我应该改变我的策略。这是一个伟大的解决方案!