Question

I'm relatively new to Django and I'm trying to build up my toolbox for future projects. In my last project, when a built-in template tag didn't do quite what I needed, I would make a mangled mess of the template to shoe-horn in the feature. I later would find a template tag that would have saved me time and ugly code.

So what are some useful template tags that doesn't come built into Django?

Was it helpful?

Solution

I'll start.

http://www.djangosnippets.org/snippets/1350/

Smart {% if %} template tag

If you've ever found yourself needing more than a test for True, this tag is for you. It supports equality, greater than, and less than operators.

Simple Example

{% block list-products %}
    {% if products|length > 12 %}
        <!-- Code for pagination -->
    {% endif %}

    <!-- Code for displaying 12 products on the page -->

{% endblock %}

OTHER TIPS

smart-if. Allows normal if x > y constructs in templates, among other things.

A better if tag is now part of Django 1.2 (see the release notes), which is scheduled for release on March 9th 2010.

James Bennet's over-the-top-dynamic get_latest tag

edit as response to jpartogi's comment

class GetItemsNode(Node):
    def __init__(self, model, num, by, varname):
        self.num, self.varname = num, varname
        self.model = get_model(*model.split('.'))
        self.by = by

    def render(self, context):
        if hasattr(self.model, 'publicmgr') and not context['user'].is_authenticated():
            context[self.varname] = self.model.publicmgr.all().order_by(self.by)[:self.num]
        else:
            context[self.varname] = self.model._default_manager.all().order_by(self.by)[:self.num]
        return  ''

<div id="news_portlet" class="portlet">
{% get_sorted_items cms.news 5 by -created_on as items %}
{% include 'snippets/dl.html' %}
</div>
<div id="event_portlet" class="portlet">
{% get_sorted_items cms.event 5 by date as items %}
{% include 'snippets/dl.html' %}
</div>

I call it get_sorted_items, but it is based on James' blog-post

In come case {% autopaginate queryset %} (http://code.google.com/p/django-pagination/) is useful. For example:

#views.py
    obj_list = News.objects.filter(status=News.PUBLISHED)
    # do not use len(obj_list) - it's evaluate QuerySet
    obj_count = obj_list.count()

#news_index.html
    {% load pagination_tags %}
    ...
    # do not use {% if obj_list %}
    {% if obj_count %}
        <div class="news">
        <ul>
        {% autopaginate obj_list 10 %}
        {% for item in obj_list %}
            <li><a href="...">{{ item.title }}</a></li>
        {% endfor %}
        </ul>
        </div>
        {% paginate %}
    {% else %}
        Empty list
    {% endif %}

Note, that obj_list must be lazy - read http://docs.djangoproject.com/en/dev/ref/models/querysets/#id1

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top