django过滤器的作用。在视图中过滤或预先格式化?

时间:2010-01-22 04:28:30

标签: django django-templates

我想听听你对此的看法。

我有一个django应用程序,从模型中获取的数据很粗糙。为了使它们更好,我必须做一些可能复杂但不多的操作。 例如,假设您有一个模型,其中美国州被编码为两个字母代码。在html呈现中,您希望向用户显示完整的州名称。我有两个字母的对应关系 - >另一个db表中的全名。我们假设我不想执行连接。

我有两个选择

  1. 让视图代码从模型中提取双字母信息,然后对第二个表执行查询,获取全名,并将其放在上下文中。模板呈现完整的州名。
  2. 创建一个自定义过滤器,它接受双字母代码,点击数据库,然后返回完整长度的名称。让视图将双字母信息传递到上下文中,并将模板中的管道放入过滤器中。过滤器将双字母代码呈现为完整字符串。
  3. 现在,这些解决方案看似相同,但从设计的角度来看也是如此。我对在过滤器责任和视图责任之间划清界线持怀疑态度。解决方案1正在解决方案2中执行过滤器的任务,它只是集成在视图本身中。当然,如果我必须在同一页面内多次调用过滤器,解决方案1可能更快(除非过滤器输出被记忆)。

    您对设计,正确编码和性能有何看法?

2 个答案:

答案 0 :(得分:2)

在我看来,你的模型应该有一个方法来进行转换。制作过滤器似乎是额外的工作,我不认为大多数Django开发人员会在过滤器中期望这样的事情。

过滤器意味着更通用 - 格式化和显示数据而不是查找。

答案 1 :(得分:2)

我的观点是,从设计的角度来看,第一个解决方案更清晰。我希望将模板图层视为演示文稿的最后阶段,其中所有信息都以视图传递(最终形式)。

最好在视图中包含所有“计算逻辑”。那个方式:

  • 阅读理解(尤其是第三方)要容易得多。

  • 我需要更改某些内容,您可以专注于特定的视图方法,并确保您需要更改的所有内容都在那里(无需在视图中来回切换)到模板)。

至于表现,我认为你的观点是正确的。如果你想多次进行相同的查找,第二种解决方案会更糟。

修改: 参考ashchristopher的评论,我实际上试图说它肯定属于模板。从来没有真正清楚什么是业务逻辑,以及“数据提供”和“业务逻辑”之间的界限在哪里。在这种情况下,似乎ashchristopher是正确的。将状态代码转换为完整状态名称可能是与数据库相关的编码问题,而不是业务逻辑代码。