什么是一些有用的非内置Django标签?

时间:2009-10-07 14:35:37

标签: python django favorites django-tagging

我对Django比较陌生,我正在尝试为未来的项目构建我的工具箱。在我的上一个项目中,当内置模板标签没有达到我所需要的水平时,我会在模板中制作一个混乱的模板,以便在该功能中使用。我后来会找到一个模板标签,可以节省我的时间和丑陋的代码。

那么Django中没有内置的一些有用的模板标签是什么?

4 个答案:

答案 0 :(得分:4)

我会开始。

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

智能{%if%}模板标记

如果您发现自己需要的不仅仅是对True的测试,那么此标记适合您。它支持相等,大于和小于运算符。

简单示例

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

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

{% endblock %}

答案 1 :(得分:3)

smart-if。允许在模板中使用正常的if x > y构造。

更好的if标记现在是Django 1.2的一部分(请参阅the release notes),计划在March 9th 2010上发布。

答案 2 :(得分:1)

詹姆斯班纳特的动态过度get_latest tag

编辑为对jpartogi评论的回复

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>

我称之为get_sorted_items,但它基于詹姆斯的博客帖子

答案 3 :(得分:1)

来自{%autopaginate queryset%}(http://code.google.com/p/django-pagination/)非常有用。例如:

#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 %}

注意,obj_list 必须懒惰 - 阅读http://docs.djangoproject.com/en/dev/ref/models/querysets/#id1