Django:自定义模板简单标签应该引发异常还是静默失败?

Posted

技术标签:

【中文标题】Django:自定义模板简单标签应该引发异常还是静默失败?【英文标题】:Django: Should custom template simple tags raise exception or fail silently? 【发布时间】:2012-01-16 07:44:05 【问题描述】:

我试图从官方文档中找到这个问题的答案,但我能找到的只是:

render() 不应该引发 TemplateSyntaxError 或任何其他 例外。它应该默默地失败,就像模板过滤器一样

但以上内容并没有真正回答这个问题,也许让我更加困惑,因为它适用于常规自定义标签,而我关心的是简单标签

这是一个例子(以及问题本身):

@register.simple_tag
def foo(formfield):
    if isinstance(formfield, forms.ChoiceField):
      # do something
    else:
      # This function doesn't deal with non-ChoiceField. 
      # Should it raise exception or fail silently?

如果您的回答是引发异常,是TemplateSyntaxError 还是其他异常?

【问题讨论】:

【参考方案1】:

如果模板标签不能产生有效的输出,它们应该总是引发异常。虽然您可以引发自定义异常,但请确保它扩展了TemplateSyntaxError——这可以确保模板解析器立即捕获该异常;您将可以访问所有必要的输入来深入研究问题。

【讨论】:

【参考方案2】:

我认为答案是“这取决于您的应用适合什么”。如果您需要或想要进行防御性编码,请引发异常。如果有正当的商业理由因为某些内容无法显示(例如价格或其他内容)而引发异常,则引发异常,或者至少是警告。

否则,让它什么都不做,并且很高兴您没有查看 .NET MVC 堆栈跟踪 :)

【讨论】:

我同意“这取决于您的应用适合什么”。谢谢。

以上是关于Django:自定义模板简单标签应该引发异常还是静默失败?的主要内容,如果未能解决你的问题,请参考以下文章

Django 模板自定义标签为布尔值

django 自定义标签内联或块

JQuery 在 Django 自定义模板标签的模板中不起作用

如何结合 Django 内置的“with”标签使用自定义模板标签?

django 编写我的第一个自定义模板标签和过滤器

在自定义模板标签中解析 Django 自定义模板标签