使用 firstof 和 striptags

Use firstof and striptags

作为 Facebook 共享包的一部分,我有这个代码:

data-share-description="{% firstof foo.bar foo.baz bang.pow bang.zap %}"

其中 returns 是正确的值,但包含 HTML 标签。如果我在每个值之后添加一个 "striptags" 过滤器,似乎 firstof 将 "None" 识别为非 False 值并返回它而不是继续向下处理列表。

编辑:

foo.bar = ''
foo.baz = None
bang.pow = '<i>Italicized text</i> and some more'
bang.zap = 'Something else'

每个 firstof 变量后没有 striptags,它 returns <i>Italicized text</i> and some more 这不是我想要的,而是我所期望的。使用条形标签,它会打印出 None。如果我从 firstof 序列中删除 foo.baz,我将得到 Italicized text and some more.

的预期值和期望值

再次编辑:

因为 foo.bazNone,striptags 抛出了 argument of type 'NoneType' is not iterable 的类型错误。我认为这是问题所在,但不知道如何解决。

由于 striptags 似乎对 None 值感到窒息,您 可以 将另一个调用链接到默认值。这意味着你最终会得到这样的结果:

{% firstof foo.baz|default:''|striptags bar.quux|default:''|striptags %}

对于列表中的每个元素。我相信你会同意这很麻烦。

这就是为什么我认为您是时候创建自己的自定义标签来为您执行此过程了:

from django import template
from django.utils.html import strip_tags

register = template.Library()

@register.simple_tag
def firstof_striptags(*args):
    for arg in args:
        if arg:
            return strip_tags(arg)

我不确定这是否完全符合您的用例,您可能想阅读一些主题,例如 Auto-escaping Considerations。此代码未经测试,但应该可以让您知道该怎么做。