python – django imagekit处理器:使用存储在数据库中的维度
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – django imagekit处理器:使用存储在数据库中的维度,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2266字,纯文字阅读大概需要4分钟。
内容图文
![python – django imagekit处理器:使用存储在数据库中的维度](/upload/InfoBanner/zyjiaocheng/900/cd176ffc38fe40d49f165e7d5360bca6.jpg)
我有一个模型,其中缩略图宽度在父对象(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处理器:使用存储在数据库中的维度全部内容,希望文章能够帮你解决python – django imagekit处理器:使用存储在数据库中的维度所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。