Skip to content

Instantly share code, notes, and snippets.

@favoyang
Last active January 21, 2021 10:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save favoyang/0641c63fea72485f412ec97de7035691 to your computer and use it in GitHub Desktop.
Save favoyang/0641c63fea72485f412ec97de7035691 to your computer and use it in GitHub Desktop.
Monkey patch wagtailimages_tags.image tag to resolve specs from a context variable.

Monkey patch wagtailimages_tags.image tag to resolve specs from a context variable.

wagtail/wagtail#2090

Usage:

  • Place the patch file into one of your templatetags folder.
  • Load the patch after the wagtailimages_tags in your template file.
{% load wagtailimages_tags %}
{% load wagtailimages_tags_patch %}

{% image some_image spec_var as img %}

Quick test:

{% with spec="width-200" %}
{% image some_image spec as img %}
{% endwith %}

 Will give you => {% image some_image width-200 as img %}
# -*- coding: utf-8 -*-
"""Monkey patch wagtailimages_tags.image tag to resolve specs from a context variable."""
from django import template
from django.utils.functional import cached_property
from wagtail.images.models import Filter
from wagtail.images.shortcuts import get_rendition_or_not_found
register = template.Library()
class ImageNodeReplace(template.Node):
def __init__(self, image_expr, filter_spec, output_var_name=None, attrs={}):
self.image_expr = image_expr
self.output_var_name = output_var_name
self.attrs = attrs
self.filter_spec = filter_spec
self.resolved_filter_spec = None
@cached_property
def filter(self):
return Filter(spec=self.resolved_filter_spec)
def render(self, context):
try:
image = self.image_expr.resolve(context)
except template.VariableDoesNotExist:
return ''
if not image:
if self.output_var_name:
context[self.output_var_name] = None
return ''
if not hasattr(image, 'get_rendition'):
raise ValueError("image tag expected an Image object, got %r" % image)
# resolve filter_specs
filter_specs = self.filter_spec.split("|")
resolved_filter_specs = []
for filter_spec in filter_specs:
if filter_spec == "original" or "-" in filter_spec:
resolved_filter_specs.append(filter_spec)
continue
try:
variable = template.Variable(filter_spec).resolve(context)
resolved_filter_specs.append(variable)
except template.VariableDoesNotExist:
resolved_filter_specs.append(filter_spec)
self.resolved_filter_spec = "|".join(resolved_filter_specs)
rendition = get_rendition_or_not_found(image, self.filter)
if self.output_var_name:
# return the rendition object in the given variable
context[self.output_var_name] = rendition
return ''
else:
# render the rendition's image tag now
resolved_attrs = {}
for key in self.attrs:
resolved_attrs[key] = self.attrs[key].resolve(context)
return rendition.img_tag(resolved_attrs)
# Monkey patch
from wagtail.images.templatetags import wagtailimages_tags
wagtailimages_tags.ImageNode = ImageNodeReplace
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment