正确使用Django assignment_tag内置标记

时间:2013-04-08 03:33:31

标签: django django-models django-templates django-1.4

我正在Django开展一个项目。

今天早些时候,我发现了新的(Django> = 1.4)assignment_tag。我立即决定它正是我所需要的,并将一些逻辑投入到对数据库执行非常简单的查询并返回结果查询集的逻辑中。我包装的函数接受一个参数,该参数允许调用上下文在我使用模板标记时直接在模板中指定要抓取的结果数。

这很方便 - 当我确定这个列表应该有5个项目而不是3个时,我不必更新我的视图 - 但它似乎是我们不应该踩的那些灰色区域之一(即推动)编写好的,可维护的Django代码时,应用程序逻辑到模板中。

现在,与编写代码分开几个小时,我想知道是否应该完全废弃assignment_tag。

代码:

models.py

class SomeObject(models.Model):
    is_active = models.BooleanField(default=False)
    (...)

templatetags / myapp_tags.py

from django import template
from myapp.models import SomeObject

register = template.Library()

@register.assignment_tag
def get_someobjects_list(max_results=0):
    queryset = SomeObject.objects.filter(is_active=True)
    if max_results == 0:
        return queryset
    elif max_results > 0:
        return queryset[:min(max_results, queryset.count())]
    else:
        return None

模板/ MyApp的/块/ someobject_list.html

{% load myapp_tags %}

{% get_someobjects_list as someobjects_list %} 
# or {% get_some_objects_list 5 as someobjects_list %} ... flexible!
{% if someobjects_list %}
<ul>
  {% for someobject in someobjects_list %}
  <li>
    <a href="{{ someobject.get_absolute_url }}">
      {{ someobject.name }}
    </a>
  </li>
  {% endfor %}
</ul>
{% else %}
<span>No someobjects exist</span>
{% endif %}

我很高兴发现这些存在 - 在这种特殊情况下对我来说很方便。现在我对寻找新功能的兴奋已经过去了,似乎很明显我在滥用它。 Django文档中给出的示例似乎是一个更好的应用程序 - 抓取当前日期时间的字符串表示,这不需要数据库查询。我担心的是,如果我经常开始使用这种模式,我会让自己心痛。沿着滑坡一直向下:我最终甚至不打算将上下文传递给我的模板,所有我的数据库查询都将隐藏在模板标签中,没有人会想到要查找它们。

如果我在发现assignment_tags并创建了一个自定义模型管理器时,我只是抛弃了整个“好主意”,那么代码似乎会更清晰。

我还缺少其他干净的方法吗?管理员方法是Django开发人员中最常见的共识吗?

1 个答案:

答案 0 :(得分:1)

如果您需要在网站的几个页面的模板上下文中获取一些信息,但不希望(或不能)将信息放入每个视图中,

分配模板标记会特别有用在网站上,并不想或不能依赖上下文处理器。

他们基本上保证您的信息将在模板中提供。