I found myself creating a web page intended to display a set of data objects, each object similar in format. A pretty common need. The simple thing to do would be to simply iterate over the list of data in the django template, for example:

{% for o in some_list %}
    <div>#display data here#</div>
{% endfor %}

I want to be able to re-use and centrally control how the data is displayed, anywhere on the site. I figured out a nice way to do this using Django templates within Django templates. The code looks something like this:

    def index(request):
        things = get_things()
        module_template = loader.get_template("thingModuleTemplate.html")
        things_html = ""
        for thing in things.itervalues():
            thing_context = RequestContext(request,{
                'thing':thing,
            })

        thing_html = module_template.render(thing_context)
        things_html += things_html
        c = RequestContext(request,{
            'things_html':things_html,
        })
        page_template = loader.get_template('index.html')
        return HttpResponse(page_template.render(c))

The module template looks something like this:

<div>
  <div>{{thing.name}}</div>
  <div>{{thing.interesting_data}}</div>
</div>

The code basically does what a normal Django view does, which is to render a page from a template and pass in data via a variable, but that for loop generates the web module html used to display each object using ‘thingModuleTemplate.html’ On each pass through the for loop, it renders a module and adds it to the thingsHtml variable. Displaying the data on the index.html template is as simple as (using the ‘safe’ tag so that things_html is treated as html and not automatically escaped):

Robert Arles