我注意到如果你将一个名为some_copy的变量传递给Django模板:
some_copy <type 'unicode'>
some_copy|length <type 'int'>
some_copy|safe <class 'django.utils.safestring.SafeUnicode'>
some_copy|safe|length <class 'django.utils.safestring.SafeString'>
我注意到长度过滤器只是在输入上调用len()
,因此在终端上测试导入django.utils.safestring.SafeUnicode
并且当您调用{{1}时似乎只返回<type 'int'>
}。关于安全过滤器如何与其他过滤器交互,这里有什么奇怪的吗?我知道有些说明建议在安全之后不要使用其他过滤器,因为它们可能会使输出更不安全。此外,此代码产生了一个错误,不再包含对len()
的调用,但我很好奇发生了什么。
答案 0 :(得分:0)
来自源代码:
@register.filter(is_safe=True)
def length(value):
"""Returns the length of the value - useful for lists."""
try:
return len(value)
except (ValueError, TypeError):
return ''
@register.filter(is_safe=True)
告诉Django通过调用length
将SaveData
函数的输出转换为mark_safe
子类实例。在整数输入的情况下,mark_safe
返回SafeString
实例。