从__str__返回mark_safe字符串

时间:2014-08-01 15:09:30

标签: python django

我有一个采用复杂数据类型的类,并使用__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。

是否可以从SafeString返回__str__而无需从模板中调用safe

1 个答案:

答案 0 :(得分:2)

你不能; __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