Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting dict object to string in Django/Jinja2 template

If you use Django or Jinja2, you've probably ran into this problem before. I have a JSON string that looks like this:

{
  "data":{
    "name":"parent",
    "children":[
      {
        "name":"child_a",
        "fav_colors":[
          "blue",
          "red"
        ]
      },
      {
        "name":"child_b",
        "fav_colors":[
          "yellow",
          "pink"
        ]
      }
    ]
  }
}

Now I want to pass this to my Jinja2 template:

j = json.loads('<the above json here>')
self.render_response('my_template.html', j)

...and iterate it like this:

<select>
{% for p in data recursive %}
        <option disabled>{{ p.name }}</option>
        {% for c in p.children %}
            <option value="{{ c.fav_colors|safe }}">{{ c.name }}</option>
        {% endfor %}
{% endfor %}
</select>

This is where I'm having the problem: everything works except Jinja2 outputs unicode encoded values for c.fav_colors. I need c.fav_colors as a valid javascript array so that I can access it from javascript. How can I get Jinja to print that value as ascii text like: ['blue','red'] instead of [u'blue', u'red'] ?

like image 542
userBG Avatar asked Jan 04 '12 13:01

userBG


1 Answers

You need to convert the fav_colors list back to JSON. Probably the easiest way to do this would be with a quick template filter:

@register.filter
def to_json(value):
    return mark_safe(simplejson.dumps(value))

So now you could do

<option value="{{ c.fav_colors|to_json }}">
like image 151
Daniel Roseman Avatar answered Sep 16 '22 14:09

Daniel Roseman