Django上传图片时基于id/username的动态文件夹名



你好,SO。

我想根据上传者的ID/用户名重命名我的文件夹名。

我的设置如下:

class Account(AbstractBaseUser):
username= models.CharField(...) # As per our setup, user cant enter their own username but will be auto created based on a separate py file on my view during registration
...
class Type01Account(models.Model):
account = models.OneToOneField(Account, on_delete=models.CASCADE)
...
imgPath = ""   
images= models.ImageField(upload_to=imgPath, null=False, blank=False) 

我应该如何分配imgPath?我应该把它分配到模型上还是视图上?如果有,我应该如何保存它?

upload_to参数可以是一个函数,它接受模型实例和文件名,并返回上传路径:

def img_path(instance, filename):
return f"{instance.account.username}/{filename}"
class Type01Account(models.Model):
account = models.OneToOneField(Account, on_delete=models.CASCADE)
...
imgPath = ""   
images= models.ImageField(upload_to=img_path, null=False, blank=False)

参考:FileField.upload_to

处理包含文件的任何字段的所有upload_to的类

import os
from django.utils import timezone

class UploadTo:
def __init__(self, name):
self.name = name
def __call__(self, instance, filename):
base_filename, file_extension = self.generate_name(filename)
path = f'files/{instance.__class__.__name__}/{self.name}/{timezone.now().strftime("%y-%m-%d")}/{base_filename}{file_extension}'
# any custom action on path
return path
def generate_name(self, filename):
base_filename, file_extension = os.path.splitext(filename)
# any custom action on file name
return base_filename, file_extension
def deconstruct(self):
# you can add some static value from model like `self.name`
return 'path.to.this.UploadTo', [self.name], {}
# Usage example
class ExampleModel(models.Model):
# add here some static value to class `news_image`
news_image = models.ImageField(_("news image"), upload_to=UploadTo('news_image'), blank=True)

最新更新