2011-01-08 6 views
1

文字列.format()を使用して、キーワード引数で文字列をフォーマットしています。いくつかの基本的なオブジェクトを文字列に渡し、文字列内のこれらのオブジェクトの属性を使用します。たとえば:Pythonでstr.format()を使用するときのHTMLエスケープ置換フィールド

"Hello, {user.first_name}!".format(user=my_user) 

これらの文字列は、HTML形式の電子メールで使用することができるので、交換用のフィールドはHTMLエスケープ(django.utils.html.escapeを使用して)でなければなりません。

文字列の書式設定時に文字列置換フィールドにエスケープ関数を使用する最も良い方法は何ですか?これが合理的に可能でない場合は、文字列書式に代わる適切な方法は何ですか?私の文字列はデータベースに保存され、Djangoの管理インターフェースを通して変更されています。

答えて

1

なぜ、あなたはまずフォーマットを使用しているのですか?これをテンプレートにプッシュするつもりはありませんか?つまり、テンプレートタグを使ってテンプレート内の何かをエスケープすると、このエスケープ関数を通して文字列を渡すだけです。

多分これはあなたが探しているものはありませんが、あなただけ行うwould't、

"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()} 

を行うことができます物事を欲しがってCRAZY!

+0

私は実際に現在のテンプレートの代わりに '.format()'を使用しています(これらは電子メールのフォーマットに使用されています)。 kwargsのエスケープ方法は、引数自体を(文字列に変換して)エスケープするので、 'user'が文字列であるため、' {user.first_name} 'のような式は機能しません。 –

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) 

このソリューションは、(escape機能は明らかにかかわらず、交換する必要があります)だけでなくジャンゴの外で動作するはずです。

関連する問題