Django:使用视图来处理模板标签的逻辑?

Posted

技术标签:

【中文标题】Django:使用视图来处理模板标签的逻辑?【英文标题】:Django: Using views to handle the logic of template tags? 【发布时间】:2014-04-20 14:26:36 【问题描述】:

我编写了一个模板标签,其中包含我通常希望在视图中找到的大部分逻辑。在编写一些单元测试时,我开始想知道一种稍微不同的方法。我没有足够的经验来判断利弊(也许这甚至是一种众所周知的做法——或者不可行......)。这就是我对您的意见感兴趣的原因。

我的想法是编写一个视图来处理所有逻辑,并使用模板标签作为包装器,将所有相关上下文传递给该视图并返回呈现的 html

我希望从这种方法中获得的优势:

更容易提供不同的输出格式 更容易干燥 更轻松的测试 在视图中使用装饰器和 mixin 进行权限检查 视图内的缓存控件 对 ajax 和/或边缘方面的好方法包括 更高的灵活性

例如,呈现树状导航的模板标签可以在通过模板标签访问时提供 HTML,同时其对应的视图仍可通过 URL 访问。

视图可以提供不同的输出格式,如 JSON、RSS、XML、处理权限检查……可以通过视图测试高级逻辑,而留给模板标签测试用例的责任只是为了确保最基本的。

我会很感激其他意见、提示或包或相关帖子的链接。

【问题讨论】:

难道不能把templatetag的大部分代码拉出来放到一个单独的utils.py模块中,同时从templatetag和view中调用吗? 反对将其全部包含在模板标签中,这将是一个明显的改进。我仍然喜欢将所有内容都包含在视图中的想法。由于模板标签解析了当前的应用程序命名空间 full_path 并进行了一些 SESSION 检查,它执行了两种我一直希望在视图中找到的逻辑。我很好奇,性能方面:与从模板标签中实例化另一个视图对象相比,utils.py 解决方案是否带来了巨大的好处? 【参考方案1】:

在我看来,模板标签的问题是:

    抽象太多。 挑战测试。 性能问题

我的建议是:

    创建一个函数来生成数据、缓存数据、处理权限以及其他任何与数据相关的内容 再编写三个函数,分别以 HTML、JSON 和 XML 呈现数据 记录和编写上述函数的测试 根据需要在视图、过滤器和模板标签中使用这些功能。调用函数的视图/过滤器/标签将非常精简且易于管理。

您通过这种方法获得的好处是:

    可重用代码 更容易测试的代码 更快的速度

【讨论】:

所以基本上第二个建议(在@jcfollower 之后)将其分离出来并根据需要从视图/标签/...中调用它。我将在重构模板标签时采用这种方式。感谢你们花时间评论/回复。

以上是关于Django:使用视图来处理模板标签的逻辑?的主要内容,如果未能解决你的问题,请参考以下文章

Django-常用模板标签及过滤器

Django基础二

Django(十五)模板详解:模板标签过滤器模板注释模板继承html转义

在 Jinja 模板中使用条件逻辑处理用户选择(凯撒密码 Django Web 应用程序)

django Tips

django Tips