On Mon, Jun 3, 2013 at 5:36 AM, Daniele Procida <[email protected]> wrote:
> The for ... empty pattern in templates is common and useful: < > https://docs.djangoproject.com/en/dev/ref/templates/builtins/#for-empty> > > But this is another common pattern: > > {% if my_bonnet.bees %} > <ul> > {% for bee in my_bonnet.bees %} > <li>{{ bee }} > ... > > In other words, we have to check first for items in the iterable before > creating a <ul> or whatever other furniture to put them in. > > The problem here is that my_bonnet.bees gets asked for twice, and it could > be my.bonnet(), some very expensive function. > > One solution is to put everything inside: > > {% with my_bonnet.bees as bees %} > > but now: > > * we've used up a precious level of indentation > * we've introduced a new variable in the templates to worry about > * it just feels a bit fussy > > Is this enough of an issue to make it worthwhile implementing some other > approach in the template system? > > This specific use case (i.e., the empty UL/OL) has bothered me in the past as well. However, I'm not sure I see an elegant way to. I'm open to suggestions, but the only way I can see around the problem is to put an extra argument on the {% for %} that allows for extra 'wrapper' content "if not empty" - something like: {% for bee in my_bonnet.bees pre="<ul class='beelist'>" post="</ul>"%} <li>{{ bee }}<li> {% empty %} <span>No bees in your bonnet.</span> {% endfor %} But I'm really not sure I like the syntax combining markup into tags arguments. Alternatively, add new sub tags to {% for %}: {% for bee in my_bonnet.bees %} {% pre %} <ul class='bee list'> {% body %} <li>{{ bee }}<li> {% post %} </ul> {% empty %} <span>No bees in your bonnet.</span> {% endfor %} but that's starting to get verbose, and leaves ambiguous what to do with content appearing between the opening {% for %} and the {% pre %} Any other syntax I can think of requires introducing another indentation level. Have you got a specific suggestion for how to address this? Russ %-) -- You received this message because you are subscribed to the Google Groups "Django developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/django-developers?hl=en. For more options, visit https://groups.google.com/groups/opt_out.
