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

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

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

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

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

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

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

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

【问题讨论】:

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

标签: django architecture views conceptual templatetags


【解决方案1】:

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

  1. 抽象太多。
  2. 挑战测试。
  3. 性能问题

我的建议是:

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

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

  1. 可重用代码
  2. 更容易测试的代码
  3. 更快的速度

【讨论】:

  • 所以基本上第二个建议(在@jcfollower 之后)将其分离出来并根据需要从视图/标签/...中调用它。我将在重构模板标签时采用这种方式。感谢你们花时间评论/回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2019-09-26
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多