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

3
我编写了一个模板标签,其中包含了我通常希望在视图中找到的大部分逻辑。在编写一些单元测试时,我开始思考一种稍微不同的方法。我感觉自己还不够有经验来判断其利弊(也许这甚至是一种众所周知的做法-或者是行不通的...)。这就是为什么我对您的意见很感兴趣。
我的想法是编写一个视图来处理所有逻辑,并使用模板标签作为包装器,将所有相关上下文传递给该视图并返回呈现的HTML。
我希望从这种方法中获得以下优势:
  • 更容易提供不同的输出格式
  • 更容易DRY
  • 更容易测试
  • 使用装饰器和混合物在视图内进行权限检查
  • 在视图内进行缓存控制
  • 针对ajax和/或边缘侧包含的好方法
  • 更高的灵活性
例如,通过模板标签访问渲染树导航的模板标签可以提供HTML,同时其相应的视图仍可通过URL访问。
视图可以提供不同的输出格式,如JSON、RSS、XML,处理权限检查等。高级逻辑可以通过视图进行测试,使模板标签的测试用例只需确保基本功能。
我希望听取其他意见、提示或相关包或帖子的链接。

1
你不能将templatetag的大部分代码提取到一个单独的utils.py模块中,并从templatetag和视图中调用它吗? - jcfollower
与将所有内容放在模板标签内相比,这将是一个明显的改进。但我仍然喜欢将所有内容放在视图中的想法。由于模板标签解析当前应用程序命名空间、full_path并进行一些SESSION检查,它执行了两种逻辑,我总是期望在视图中找到的。就性能而言,我很好奇:与在模板标签内实例化另一个视图对象相比,utils.py解决方案是否具有巨大的优势? - sthzg
1个回答

1
在我看来,模板标签存在以下问题:
  1. 过于抽象。
  2. 难以测试。
  3. 性能问题。
我的建议是:
  1. 创建一个生成数据、缓存数据、处理权限等与数据相关的函数。
  2. 编写另外三个函数,分别将数据呈现为HTML、JSON和XML格式。
  3. 为上述函数编写文档并进行测试。
  4. 根据需要在视图、过滤器和模板标签中使用这些函数。调用这些函数的视图/过滤器/标签非常简单易管理。
这种方法带来的好处有:
  1. 可重复使用的代码。
  2. 更易于测试的代码。
  3. 更好的速度。

基本上,根据@jcfollower的第二个建议,将其分离并根据需要从视图/标签等调用。在重构模板标记时,我会采取这种方式。感谢你们两个抽出时间来评论/回复。 - sthzg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接