gpt4 book ai didi

django - 正确使用 Django assignment_tag 内置标签

转载 作者:行者123 更新时间:2023-12-02 03:47:44 26 4
gpt4 key购买 nike

我正在使用 Django 开发一个项目。

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

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

现在,距离编写代码还有几个小时,我想知道是否应该完全废弃 assignment_tag。

代码:

模型.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

templates/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 开发人员一致认为的最佳方法吗?

最佳答案

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

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

关于django - 正确使用 Django assignment_tag 内置标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15870828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com