ducktape icon indicating copy to clipboard operation
ducktape copied to clipboard

template renderer renders properties strangely

Open granders opened this issue 10 years ago • 1 comments

Refactoring a field into a property can lead to surprising results when rendering

class C(TemplateRenderer):
  x = 2

class D(TemplateRenderer):
  @property
  def x(self):
    return 2

c = C()
d = D()
c.render_template("{{x}}")  # "2"
d.render_template("{[x}}")  # "<property ob... 0x101300e68>"

Cause: @propertys show up in the class dict as a property object, but not in the instance dict, and TemplateRenderer uses these dicts when rendering. So the computed property value isn't visible to the render method.

granders avatar Oct 21 '15 08:10 granders

There's probably a good solution to this somewhere in Jinja itself -- I'd dig around in their code (or example code) to see if there's a better approach for passing a full object as the context but also providing overrides/extensions via extra parameters to the render method.

ewencp avatar Oct 21 '15 23:10 ewencp