我使用字符串.format()
函数来设置关键字参数的字符串格式。我将一些基本对象传递给字符串,并在字符串中使用这些对象的属性。例如:
"Hello, {user.first_name}!".format(user=my_user)
这些字符串可能会在HTML电子邮件中使用,因此替换字段应进行HTML转义(使用django.utils.html.escape
)。
格式化字符串时,为字符串替换字段使用转义函数的最佳方法是什么?如果这不合理,那么字符串格式的替代方法是什么?我的字符串存储在数据库中,并通过Django管理界面进行修改。
答案 0 :(得分:1)
嗯,问题是为什么你开始使用格式。你打算不把它推到模板上吗?我的意思是,如果你在模板中逃避某些东西(使用模板标签),你几乎只是通过这个转义函数传递一个字符串。
也许这不是你想要的,但你不会这样做,
"Hello, {user.first_name}!".format(user=django.utils.html.escape(my_user))
如果你想逃避所有的争论而且你确定他们会这样做 字符串,
def foo(**kwargs):
for key,val in kwargs.iteritems():
kwargs[key] = django.utils.html.escape(val)
...
你也可能做一些更疯狂的事情,
def foo(**kwargs):
kwargs = dict((key, val) for key,val in izip(kwargs.iterkeys(), \
map(django.utils.htmls.escape, kwargs.itervalues())))
# OR if you use Python 3
kwargs = {key:django.utils.htmls.escape(val) for key, val in kwargs.items()}
如果你想让东西疯狂!
答案 1 :(得分:0)
作为临时解决方案,在我转向使用Django模板之前,我按照documentation中的提法将string.Formatter
子类化。
import string
from django.utils.html import escape
class EscapingFormatter(string.Formatter):
def format_field(self, value, format_spec):
return escape(super(EscapingFormatter, self).format_field(value, format_spec))
formatter = EscapingFormatter()
formatter.format("Hello, {user.first_name}!", user=my_user)
此解决方案也应该在Django之外工作(escape
函数显然需要替换)。