【问题标题】:How can I make a django model upload its files to a folder named after the model instance?如何让 django 模型将其文件上传到以模型实例命名的文件夹中?
【发布时间】:2020-10-27 02:22:22
【问题描述】:

如何让 django 模型将其文件上传到以模型实例的属性命名的文件夹中?

这是我的模型。我正在尝试让它将所有文件上传到 badgeTemplates/[此处的模型实例名称]。

class BadgeTemplate(models.Model):
name = models.CharField(max_length=50,unique=True)
slug = models.SlugField(unique=True)
template = models.FileField(upload_to='badgeTemplates/',unique=True)
configFile = models.FileField(upload_to='badgeTemplates/',unique=True)
def __str__(self):
    return self.name

我试过 upload_to='badgeTemplates/' + self.name 但它说 self 没有定义。

【问题讨论】:

    标签: python django


    【解决方案1】:

    您可以将可调用对象传递给upload_to=… parameter [Django-doc]

    class BadgeTemplate(models.Model):
        
        def upload_file_name(self, filename):
            return f'badgeTemplates/{self.name}/{filename}'
        
        name = models.CharField(max_length=50, unique=True)
        slug = models.SlugField(unique=True)
        template = models.FileField(upload_to=upload_file_name, unique=True)
        configFile = models.FileField(upload_to=upload_file_name, unique=True)
    
        def __str__(self):
            return self.name

    你应该使用括号(upload_file_name()),因为你传递函数调用的result。您需要传递对函数本身的引用。

    【讨论】:

    • 如果我这样做 'def upload_file_name(self, filename): #sets upload location to badgeTemplates/self.name/ return f'badgeTemplates/{self.name}/template/{filename}',删除模型实例后如何删除 self.name 文件夹?
    • @memtech3:您可以发出信号,或为此发出管理命令:stackoverflow.com/a/19288242/67579
    • if instance.pk 语句有什么作用?
    • @memtech3:在保存之前获取实例的id(主键)。
    • @memtech3:也许你可以看看一些 Django 插件:github.com/un1t/django-cleanupgithub.com/akolpakov/django-unused-media
    猜你喜欢
    • 2021-07-30
    • 2019-07-19
    • 2021-11-04
    • 2012-04-22
    • 2012-11-22
    • 2013-06-01
    • 2021-09-19
    • 2011-03-12
    • 1970-01-01
    相关资源
    最近更新 更多