XMLセーフデータのみを保存するはずのデータベースとインターフェースするDjangoサイトを構築しています。"Mike & Ike"のような文字列は"Mike & Ike"として保存する必要があります
私が見る限り、これには2つのアプローチがあります。フォームを検証するときに、文字列を XML セーフ文字列に変換できます。テキスト データを格納できるすべてのフィールドに対してxml.sax.saxutils.escape
、適切な検証関数を呼び出す必要があります。さらに、DB モデルからフォーム オブジェクトに初期データを提供する場合、関数を使用して文字列を安全であるとマークする必要があります (フォームの html 出力はすべての値を自動的にエスケープするため、 |safeやautoescape offdjango.utils.safestring.mark_safe
などのテンプレート フィルターはここでは役に立ちません)。
class NameForm(forms.Form):
name = forms.CharField()
def clean_name(self):
from xml.sax.saxutils import escape
return escape(self.cleaned_data['name'])
from django.utils.safestring import mark_safe
form = NameForm(initial={'name': mark_safe(Customer.objects.get(pk=1).name)})
このアプローチには欠点があります。escape
dになってから弦がかなり変わることがあります。さらに、すべての初期値を安全にマークすることを忘れないでください。より良いアプローチは、値がデータベースに書き込まれる直前に、データベースの保存時に値をエスケープすることだと思います。値をモデル オブジェクトに直接代入できるので、値をエスケープする心配はありません。また、オブジェクトがデータベースから検索される場合c = Customer.objects.get(pk=1)
、値c.name
はエスケープされていない値である必要があります。例えば:
c = Customer(id=1, name="Mike & Ike")
c.full_clean() # "test drive" escaping here and make sure it does not cause field overflow
c.save()
# database now have
# CUSTOMER
# NAME: 'Mike & Ike'
c1=Customer.objects.get(pk=1)
c1.name # Mike & Ike
c.name # Mike & Ike
それは可能ですか?どこから始めればよいですか?Django のドキュメントを読みましたが、データが保存されるときに実行される手順について説明していますが、その動作をカスタマイズする方法に関するガイドはありません。そこに記載されているステップ 3 をカスタマイズしたいと思いますが、提案は受け付けています。どんな助けでも大歓迎です。