0

このように urlize フィルターを使用できますか? :

from django.utils.html import urlize

def save(self, force_insert=False, force_update=False):
    self.body = urlize(self.body)
    super(Post, self).save(force_insert, force_update)

body は TextField です。

4

1 に答える 1

1

そのスニペットが構文と見なされる限り機能するかどうかを尋ねる場合、答えが「はい」の場合、サーバー 500 エラーが発生することはありません。

しかし、urlizeのドキュメントには次のように書かれています。

既に HTML マークアップを含むテキストに urlize を適用すると、期待どおりに動作しないことに注意してください。このフィルターはプレーン テキストにのみ適用します。

したがって、オブジェクトが最初に作成されたときにコンテンツがプレーンテキストであると仮定すると、すべて問題ありません。

既存のオブジェクトを編集する場合、 を呼び出すと、この時点ではプレーン テキストではない属性のコンテンツにフィルターsaveが再適用されます。urlizebody

私が知る限り、コンテンツで適切にフォーマットされた HTML リンクのみが使用されている場合、これは深刻な問題を引き起こすことはありませんが、ドキュメントでは、引数としてプレーンテキストのみを使用する必要があることが依然として示唆されていますurlize

たとえば、アクティブステートから MLStripper クラスurlizeを使用して、呼び出しの前に毎回挿入された HTMLを削除できます。urlize

from somelib import MLStripper
def save(self, force_insert=False, force_update=False):
    html_stripper = MLStripper()
    html_stripper.feed(self.body)
    self.body = urlize(html_stripper.get_fed_data())
    super(Post, self).save(force_insert, force_update)

理論的には少なくとも...

モデルでテンプレート フィルターを使用する非常に強い理由がない限り、実際にすべきことは、urlizeテンプレートで次のように使用することです。

{{ object.body|urlize }}
于 2010-05-27T21:40:27.573 に答える