作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个包含多个 ImageField 的 Django 模型,并使用一个可调用对象来确定上传路径。我想在上传路径中包含原始上传字段的名称,在本例中为 tiny
、small
、medium
或 press
.
我能想到的唯一方法是创建一个 pre_save 接收器,用 uuid 替换 file.name
。然后 upload_to 可调用文件通过将其与 filename
进行比较来找到匹配项。有没有更简单的方法来做到这一点?
class SomeDjangoModel(models.Model):
IMAGE_SIZES = ('tiny', 'small', 'medium', 'press')
def image_path(self, filename):
""" Example return: [some-django-model]/[medium]/[product1].[jpg] """
size = None
for field_name in self.IMAGE_SIZES:
field_fn = getattr(getattr(self, field_name), 'name', '')
if field_fn == filename.rpartition('/')[2]:
size = field_name
break
return u'{}/{}/{}.{}'.format(
slugify(self._meta.verbose_name),
size or 'undetermined',
self.slug,
filename.rpartition('.')[2].lower(),
)
tiny = models.ImageField(upload_to=image_path, blank=True, null=True)
small = models.ImageField(upload_to=image_path, blank=True, null=True)
medium = models.ImageField(upload_to=image_path, blank=True, null=True)
press = models.ImageField(upload_to=image_path, blank=True, null=True)
pre_save
接收器:
@receiver(pre_save, sender=SomeDjangoModel)
def set_unique_fn(sender, instance, **kwargs):
""" Set a unique (but temporary) filename on all newly uploaded files. """
for size in instance.IMAGE_SIZES:
field = getattr(instance, '{}_img'.format(size), None)
if not field:
continue
fieldfile = getattr(field, 'file', None)
if isinstance(fieldfile, UploadedFile):
fieldfile.name = u'{}.{}'.format(
uuid.uuid4().hex,
fieldfile.name.rpartition('.')[2],
)
最佳答案
您可以更改 image_path()
以便它返回一个已知大小的可调用对象:
def image_path(size):
def callback(self, filename)
""" Example return: [some-django-model]/[medium]/[product1].[jpg] """
return u'{}/{}/{}.{}'.format(
slugify(self._meta.verbose_name),
size,
self.slug,
filename.rpartition('.')[2].lower(),
)
return callback
class SomeDjangoModel(models.Model):
tiny = models.ImageField(upload_to=image_path('tiny'), blank=True, null=True)
small = models.ImageField(upload_to=image_path('small'), blank=True, null=True)
medium = models.ImageField(upload_to=image_path('medium'), blank=True, null=True)
press = models.ImageField(upload_to=image_path('press'), blank=True, null=True)
关于python - 动态上传路径 - 包括原始字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6889156/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!