【问题标题】:What are some useful non-built-in Django tags?有哪些有用的非内置 Django 标签?
【发布时间】:2009-10-07 14:35:37
【问题描述】:

我对 Django 比较陌生,我正在尝试为未来的项目构建我的工具箱。在我的上一个项目中,当内置模板标签不能完全满足我的需要时,我会将模板弄得一团糟,以便在功能中加入鞋拔。后来我会找到一个模板标签,它可以节省我的时间和丑陋的代码。

那么有哪些有用的模板标签没有内置在 Django 中?

【问题讨论】:

    标签: python django favorites django-tagging


    【解决方案1】:

    我要开始了。

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

    【讨论】:

    【解决方案2】:

    smart-if。允许在模板中使用普通的if x &gt; y 构造等。

    一个更好的 if 标签现在是 Django 1.2 的一部分(参见 the release notes),它计划在 March 9th 2010 发布。

    【讨论】:

    • “几乎肯定会内置到下一个版本中”,你确定吗?我读到的关于模板标签更强大的所有内容都会遭到所有开发人员的反对。有链接吗?
    • 在大多数情况下你是对的,但不允许在if 标签中进行正确比较的特定决定已被认为是一个错误(例如在 Simon Willison 在 EuroDjangoCon 09 上的演讲中)。这里肯定是针对 1.2 提出的:code.djangoproject.com/wiki/Version1.2Features 虽然我暂时找不到任何讨论。
    【解决方案3】:

    James Bennet 的顶级动态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,但它是基于 James 的博文

    【讨论】:

    • 那个 get_latest 标签不是很灵活,尤其是当你有很多标准的时候。
    • 使用自定义管理器,您应该能够解决这些问题。当然 get_latest 最能适应。请参阅我的编辑以获取一个粗略的示例。
    【解决方案4】:

    在这种情况下 {% 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      相关资源
      最近更新 更多