Simon Willison wrote: > > > On 14 Nov 2005, at 06:06, Tom Tobin wrote: > >> A bit stumped here . . . Is there a recommended convention for >> repeating blocks within a template? e.g., I have a paginated >> object_list generic view, and I want to repeat my pager code (i.e., >> "back", "next") at both the top and bottom of the list without copying >> and pasting. > > > Not really. You can write a custom template tag for your buttons but > that might be considered overkill - and would also mean that some of > your presentation logic would end up in Python code (in the template > tag definition). > > Maybe it's time we bit the bullet and introduced a {% capture %} tag > (or similar) that chucks the rendered output of its contents in a > variable in the context. Then you could do this: > > {% capture pagination_controls %} > ... HTML goes here ... > {% end capture %} > {{ pagination_controls }} > > ... more stuff ... > > {{ pagination_controls }} > > I think we've avoided this in the past because it makes Django's > template language too much like a programming language, but I think it > provides an elegant solution to your problem and hence should be a > candidate for inclusion - unless we can come up with a more elegant > solution. > > Cheers, > > Simon Willison >
For this kind of thing I use @inclusion_tag. This is in new-admin and ticket #625 . It is a decorator which makes creating simple tags very easy: -------------------- tag definition ---------------------- @inclusion_tag('farming/cow_detail') def cow_display(cow): return { 'name': cow.name, 'similar': find_similar_cows(cow) } ------------------------- template : 'farming/cow_detail' ------------------------- <div> <h2>{{name}}</h2> <b> similar cows: </b> {%for cow in similar %} <p>{{cow.name}}</p> {% end for %} </div> -------------------------- Use in other template ------------------------- {% cow_display cow %} ------------------------ The good thing about defining a template tag is that it is easily reusable across multiple templates, not just within one. For even simpler cases, I use the {% include path/to/template %} tag detailed in #598.