python – django imagekit处理器:使用存储在数据库中的维度
作者:互联网
我有一个模型,其中缩略图宽度在父对象(ForeignKey)之间变化.我需要能够将此信息提供给imagekit处理器.这就是我所拥有的:
class Wall(models.Model):
#...
width = models.SmallIntegerField(null=True, blank=True)
#...
class Poster(models.Model):
wall = models.ForeignKey(Wall, related_name='posters')
#...
original_image = models.ImageField(upload_to=upload_image_to)
def __init__(self, *args, **kwargs):
self.thumbnail = ImageSpecField([
Adjust(contrast=1.2, sharpness=1.1),
SmartResize(height=163, width=self.wall.width)
],
image_field='original_image', format='PNG'
)
super(Poster, self).__init__(*args, **kwargs)
#...
但是,如果我这样做,没有任何反应,甚至没有生成缩略图网址.
以下将导致此异常:
AttributeError:’ForeignKey’对象没有属性’width’
class Poster(models.Model):
wall = models.ForeignKey(Wall, related_name='posters')
#...
original_image = models.ImageField(upload_to=upload_image_to)
thumbnail = ImageSpecField([
Adjust(contrast=1.2, sharpness=1.1),
SmartResize(height=163, width=wall.width)
],
image_field='original_image', format='PNG'
)
#...
解决方法:
您无法在模型定义中引用实例值.这就是Django变得有点棘手的地方;模型是实例化时实例的外观的声明,这就是相互依赖的字段必须通过名称引用其他字段的原因,例如image_field =’original_image’规范.
从imagekit的源代码可以看出,处理器可以采用要应用的静态处理器列表,也可以使用可调用的处理器,它应返回要在生成时应用的处理器列表.由于您希望生成在运行时根据宽度进行更改,因此您可以使用此优势.
使用缩略图字段出现的实例调用可调用的处理器,然后允许您查找宽度.
def thumbnail_processors(instance, file):
# Dynamic width lookup.
width = instance.wall.width
return [
Adjust(contrast=1.2, sharpness=1.1),
SmartResize(width=width, height=163),
]
class Poster(models.Model):
wall = models.ForeignKey(Wall, related_name='posters')
#...
original_image = models.ImageField(upload_to=upload_image_to)
thumbnail = ImageSpecField(
processors=thumbnail_processors,
image_field='original_image', format='PNG'
)
#...
现在,当您访问该字段时,将调用thumbnail_processors以在运行时获取处理器列表,而不是在模型声明中.宽度是从您的外键获得的,并执行适当的调整大小.
可能有些问题需要调查.当您访问缩略图时,将根据您的宽度生成图像文件.如果您稍后更改宽度并再次请求缩略图,我不确定存储和缓存后端的行为方式.您可能需要一个自定义文件名生成器,它可以对缩略图的宽度进行编码,这样当宽度发生变化时,将生成一个具有不同名称的新缩略图.
标签:python,django,imagekit,django-imagekit 来源: https://codeday.me/bug/20190718/1493941.html