3

現在、このスニペットに取り組んでいます

@register_snippet
class Foo(models.Model):
    body = RichTextField()

__str__どういうわけか、複数のスニペットを区別できるように定義する必要があると判断しました。文字列表現としてコンテンツを使用bodyすることは良い考えだと思います。ただし、本体は非常に大きくなる可能性があるため、最初の 20 文字で十分です。

このタスクは簡単だと思って、次のコードを書きました。

@register_snippet
class Foo(models.Model):
    body = RichTextField() 

    def __str__(self):
        return self.body[:20]

<p>Quequeueueueue?</...やなどの見苦しい表現になってしまいました<p>FOO<br/></p>

データベースを調べたところ、マークアップがデータベースに保存されていることがわかりました。とはいえ、私はまだ疑問に思っています。

CPU を大量に消費する HTML パーサーを使用せずに HTML マークアップを削除し、全体を解析する方法は何bodyですか?

正規表現で一部の</aタグを削除できると思いますが、</blockqu<、 のような状況をどのように処理すればよい</でしょうか?

4

2 に答える 2

1

html を安全にエスケープする組み込みの方法はありません。ドキュメントから-

バージョン 1.8 以降非推奨: removetagsHTML の安全な出力を保証できず、セキュリティ上の懸念により非推奨になりました。代わりに漂白剤の使用を検討してください。

Bleachは、Mozilla の html サニタイズ ライブラリです。すべてのタグを削除してブリーチされた文字列を返すメソッドをスニペット クラスに作成するのが最も理にかなっている場合があります。

さらに、組み込みのテンプレート タグ truncatewordstruncatecharsなどを使用して、テンプレートのレンダリング時に表示される文字/単語の数を制限できます。

于 2016-03-27T21:02:28.023 に答える
0

@Ian Price のコメントで示唆されているように、作業しているコンテンツを信頼できる場合、正規表現は正常に機能します。例えば:

import re

...

def __str__(self):
    remove_tags = re.compile('<.*?>')
    return re.sub(remove_tags, '', self.body)
于 2021-06-01T10:32:00.427 に答える