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 に答える