正确使用Django assignment_标记内置标记

正确使用Django assignment_标记内置标记,django,django-models,django-templates,django-1.4,Django,Django Models,Django Templates,Django 1.4,我在Django做一个项目 今天早些时候,我发现了新的(Django>=1.4)assignment\u标签。我立即决定这正是我在任何地方都需要的,并在其中加入了一些逻辑,对数据库执行了一个非常简单的查询,并返回了结果queryset。我包装的函数接受一个参数,该参数允许调用上下文指定在使用模板标记时直接在模板中获取多少结果 这很方便——当我决定这个列表应该有5项而不是3项时,我不必更新我的视图——但在编写好的、可维护的Django代码时,它似乎是我们不应该涉足的灰色区域之一(即将应用程序逻辑推

我在Django做一个项目

今天早些时候,我发现了新的(Django>=1.4)
assignment\u标签
。我立即决定这正是我在任何地方都需要的,并在其中加入了一些逻辑,对数据库执行了一个非常简单的查询,并返回了结果queryset。我包装的函数接受一个参数,该参数允许调用上下文指定在使用模板标记时直接在模板中获取多少结果

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

现在,在编写代码的两个小时后,我想知道是否应该完全取消赋值标记

代码:

型号.py

class SomeObject(models.Model):
    is_active = models.BooleanField(default=False)
    (...)
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
{% 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 %}
模板标签/myapp_标签.py

class SomeObject(models.Model):
    is_active = models.BooleanField(default=False)
    (...)
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
{% 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 %}
模板/myapp/chunks/someobject\u list.html

class SomeObject(models.Model):
    is_active = models.BooleanField(default=False)
    (...)
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
{% 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 %}
{%load myapp_tags%}
{%get\u someobjects\u list作为someobjects\u list%}
#或{%get_some_objects_list 5 as someobjects_list%}。。。灵活!
{%if someobjects\u list%}
    {someobjects\u list%}
  • {%endfor%}
{%else%} 不存在任何对象 {%endif%}
我真的很兴奋地发现这些存在-这对我在这个特殊的情况下很方便。现在,我对发现一个新特性的兴奋已经过去,很明显我在滥用它。Django文档中给出的示例似乎是一个更好的应用程序——获取当前日期时间的字符串表示,这不需要DB查询。我担心的是,如果我开始经常使用这种模式,我会让自己心痛。一路走下坡路:我甚至懒得把上下文传递给我的模板,我所有的DB查询都隐藏在模板标记中,没有人会想到去寻找它们

如果我抛弃了我在发现assignment_标记并创建自定义模型管理器时的整个“好主意”,代码似乎会更干净


有没有其他干净的方法来实现这一点,我错过了?管理者方法是Django开发人员达成共识的最佳方法吗?

如果您需要在网站的几个页面的模板上下文中获取一些信息,但不想(或不能)将这些信息放到网站上的每个视图中,并且不想或不能依赖上下文处理器,则分配模板标记尤其有用


它们基本上保证您的信息在模板中可用。

在这种情况下,我会让您的视图存储
someobjects\u list
到上下文中,这样您就不需要templatetag,您的查询将位于有意义的地方(在您的视图中,或者在自定义管理器上的模型中)。