使用firstof和striptags

时间:2015-09-01 18:47:48

标签: python django django-templates

作为Facebook sharekit的一部分,我有以下代码:

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

返回正确的值,但包含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,它返回<i>Italicized text</i> and some more这不是我想要的,但是我期待的。使用条带标签,它会打印出None。如果我从foo.baz序列中删除firstof,我会得到Italicized text and some more的预期和期望值。

再次编辑:

由于foo.bazNone,因此striptags会引发argument of type 'NoneType' is not iterable的TypeError。我认为这是问题,但不知道如何解决它。

1 个答案:

答案 0 :(得分:1)

由于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。此代码未经测试,但应该让您知道该怎么做。