3

我正在用 Django 做一个项目。

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

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

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

代码:

模型.py

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

模板标签/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/chunks/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 开发人员达成共识的最佳方法吗?

4

1 回答 1

1

如果您需要将一些信息放入网站几页的模板上下文中,但不想(或不能)将信息放入网站的每个视图中,那么分配模板标签特别有用,并且不要'不想或不能依赖上下文处理器。

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

于 2014-04-22T02:34:10.410 回答