【问题标题】:Django setting for default template tag output when variable is None?变量为无时默认模板标签输出的Django设置?
【发布时间】:2011-11-27 06:13:38
【问题描述】:

我正在寻找一种 django 设置或编程方式,以使所有 django 模板标签在值为 None 时显示空字符串。例如,假设我有一些 django 模板:

{{cat}} chases {{mouse}}

如果 cat 和 mouse 都为 None,它将呈现为:

None chases None

我知道我可以使用{{cat|default:""}}{{mouse|default_if_none:""}} 设置每一个

但是,我正在寻找某种设置,允许我为所有标签设置默认值,而无需将|default:"" 显式添加到每个标签。

我还知道一个名为TEMPLATE_STRING_IF_INVALID 的设置。但是,此设置仅适用于无效字符串。没有一个被认为是有效的。

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    不存在这样的事情。这就是存在defaultdefault_if_none 过滤器的原因。这是一个功能;它让你思考你在做什么,而不是依赖于一些经常会误导的行为。如果变量有可能是None,那么您应该为这种意外情况做好准备。如果变量应始终具有 some 值,则“无”表示某些地方不正确。如果默认只呈现一个空白字符串,那么您将不知道该值是否未定义或实际上是一个空白字符串。编写连贯的代码,忘记快捷方式。

    【讨论】:

    • 跛脚。 “请求宽恕比许可更容易”发生了什么?恐怕这不是非常 Pythonic 并且根本不遵循 DRY — 到处写 default_if_none!为了规避这个“功能”,forms.fields.CharField 永远不会返回 None,因为最好存储空字符串 DB……是的,当然 :P — 抱歉吹牛,我忍不住。
    • @WooYek:另一点是从模板中取出逻辑。一方面,我可能实际在模板中使用defaultdefault_if_none 的次数,主要是因为我计划我的模型和视图,以便总有一些 返回值,或者它在模板中的 if 块中。简单地说,如果你的模板中到处都是这些标签,我会说这更多的是你的失败而不是 Django 的。
    • 相同的论点可以应用于删除TEMPLATE_STRING_IF_INVALID 设置,但它退出了...... Django 开发人员是否不计划他们查看,因此它们不包含丢失的字段!?我很少使用default_if_none,但更不用说我设置为空字符串以外的其他内容。我只是说:它 - 缺少的设置 - 不存在,因为没有太多需求,因为没有多少地方 - 在 django 中 - “空”意味着 None 类型。没有别的了。
    • 而永恒的“模板逻辑”错得离谱,你是说DATE_FORMAT设置错了吗?无论如何,对于这样的讨论,这不是请。再次,对吹牛感到抱歉,对我来说这是 EOT。
    【解决方案2】:

    “显式优于隐式”

    想一想,当您忘记启用了“将所有内容以假值渲染为空字符串”设置而导致无法正确渲染时,您会感到多么愤怒。

    如果您发现您经常使用default_if_none 过滤器,您可能需要考虑在将其传递给模板之前将转换None 更改为''

    您的模板会更简单,并且您将明确做出将空值字符串化的决定。

    【讨论】:

      【解决方案3】:

      这应该可以解决问题,将其放在初始化代码中的某个位置,例如。在wsgi.py

      # Patch template Variable to output empty string for None values
      from django.template.base import Variable
      _resolve_lookup = Variable._resolve_lookup
      def new_resolve_lookup(self, *args, **kwargs):
          o = _resolve_lookup(self, *args, **kwargs)
          return o or u""
      Variable._resolve_lookup = new_resolve_lookup
      

      【讨论】:

      • 这实际上完成了工作,我将代码放在中间件文件中,但在类之外
      猜你喜欢
      • 2022-10-14
      • 2019-01-13
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 2018-03-19
      • 2021-09-23
      相关资源
      最近更新 更多