从__str__返回mark_safe字符串

0 投票
1 回答
1425 浏览
提问于 2025-04-18 15:39

我有一个类,这个类可以处理复杂的数据类型,并通过 __str__ 方法返回它的字符串表示。这样,我就可以直接在模板中使用这个对象了。不过,我还想在返回的字符串中包含HTML内容。如果我把这个字符串用 mark_safe 包裹起来并在模板中显示,HTML内容就会被转义。

这是我的类:

class StrTest:
  def __init__(self, num):
    self.num = num

  def __str__(self):
    return mark_safe("<span style='color:red'>Number is " + str(self.num) + '</span>')

这是我如何将它传递给模板的:

  return render(request, 'my_template.html', {
    'str_test': str_test,
    })

还有我的模板:

{{str_test}}

如果我使用 {{str_test|safe}},那么HTML内容就不会被转义了。

有没有办法让 __str__ 方法返回一个 SafeString,而不需要在模板中调用 safe 呢?

1 个回答

5

你不能这样做;从 __str__ 返回的值必须是一个 str 类型的值。

不过,支持 __html__ 属性的模板语言会自动调用这个属性:

class StrTest:
    def __init__(self, num):
        self.num = num

    def __str__(self):
        return str(self.num)

    def __html__(self):
        return mark_safe(
            '<span style="color: red">Number is {0}</span>'.format(self.num))

Django 从 1.7 版本开始支持这个功能,详情请查看 ticket #7261

撰写回答