A Bit of Modular Web Design in Django
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