0

XMLセーフデータのみを保存するはずのデータベースとインターフェースするDjangoサイトを構築しています。"Mike & Ike"のような文字列は"Mike & Ike"として保存する必要があります

私が見る限り、これには2つのアプローチがあります。フォームを検証するときに、文字列を XML セーフ文字列に変換できます。テキスト データを格納できるすべてのフィールドに対してxml.sax.saxutils.escape、適切な検証関数を呼び出す必要があります。さらに、DB モデルからフォーム オブジェクトに初期データを提供する場合、関数を使用して文字列を安全であるとマークする必要があります (フォームの html 出力はすべての値を自動的にエスケープするため、 |safeautoescape 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)})

このアプローチには欠点があります。escapedになってから弦がかなり変わることがあります。さらに、すべての初期値を安全にマークすることを忘れないでください。より良いアプローチは、値がデータベースに書き込まれる直前に、データベースの保存時に値をエスケープすることだと思います。値をモデル オブジェクトに直接代入できるので、値をエスケープする心配はありません。また、オブジェクトがデータベースから検索される場合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 をカスタマイズしたいと思いますが、提案は受け付けています。どんな助けでも大歓迎です。

4

1 に答える 1

0

カスタムsave()メソッドを作成してそこでエスケープできます

https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

例えば

def save(self, *args, **kwargs):
    self.name = clean_name(self.name)
    super(NameForm, self).save(*args, **kwargs)
于 2012-10-19T23:29:35.083 に答える