memtech3
memtech3

Reputation: 147

How can I make a django model upload its files to a folder named after the model instance?

How can I make a django model upload its files to a folder named after a property of the models instance?

Here is my model. I am trying to make it upload all files to badgeTemplates/[model instance name here].

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

I've tried upload_to='badgeTemplates/' + self.name but it says that self isn't defined.

Upvotes: 1

Views: 461

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476614

You can pass a callable to the 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

You should not use parenthesis (upload_file_name()), since then you pass the result of the function call. You need to pass a reference to the function itself.

Upvotes: 1

Related Questions