1

假设我们有这样的消息:

            messages.add_message(request, messages.SUCCESS,
                _('Document <a href="%(url)s">%(doc_type_name)s %(name)s (%(fname)s)</a> created.') % {
                    'doc_type_name': conditional_escape(document.doc_type.name),
                    'name': conditional_escape(document.title),
                    'fname': conditional_escape(document.name),
                    'url': document.get_absolute_url()
                })

在这里,只有当我们显示消息时它才会起作用,{{ message|safe }}但我们不希望这样,因为如果其中有一些代码,%(name)它也会被执行。

如果我使用:

            messages.add_message(request, messages.SUCCESS,
                mark_safe(_('Document <a href="%(url)s">%(doc_type_name)s %(name)s (%(fname)s)</a> created.') % {
                    'doc_type_name': conditional_escape(document.doc_type.name),
                    'name': conditional_escape(document.title),
                    'fname': conditional_escape(document.name),
                    'url': document.get_absolute_url()
                }))

mark_safe不起作用。

我在那里阅读了一个解决方案:https ://stackoverflow.com/a/12600388/186202

但这是我在这里需要的相反:

_('Document %s created.') % mark_safe('')

一旦它通过ugettext function它就不再安全了。

我应该怎么做?

4

2 回答 2

3

您试图通过在 Python 代码中放置 HTML 来混合视图和逻辑。好吧,有时您只需要这样做,但事实并非如此。

mark_safe() 返回由 Django 模板特别处理的 SafeString 对象。如果 SafeString 由 ugettext 或 % 评估,您将再次获得字符串,这是预期的行为。您不能仅将格式化字符串标记为安全,或者使用文档名称/标题等完成输出,或者一切都不安全。即,它不会以这种方式工作。

您可以将 HTML 放入模板并使用 render_to_string(),这可能是最好的选择。

文档标题、名称和 doc_type.name 是否由用户设置?如果没有,您可以跳过 mark_safe 和使用文档属性中的 HTML 作为功能的文档。

于 2012-09-28T00:31:56.780 回答
2

之前的回答是正确的:您应该尽可能避免混合使用 python 和 html。

要解决您的问题:

from django.utils import six  # Python 3 compatibility
from django.utils.functional import lazy
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
mark_safe_lazy = lazy(mark_safe, six.text_type)

然后:

lazy_string = mark_safe_lazy(_("<p>My <strong>string!</strong></p>"))

在 django 文档中找到: https ://docs.djangoproject.com/en/1.9/topics/i18n/translation/#s-other-uses-of-lazy-in-delayed-translations

于 2016-06-08T08:57:21.903 回答