我正在用 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 开发人员达成共识的最佳方法吗?