5

Django Haystack を使用して自分のサイトで検索を行っていますが、TextField のすべての html コードをテンプレート フィルター"safe"でフィルター処理し、検索基準に従って検索結果を強調表示する必要があります。

これを行う方法はありますか?私は試してみました

{% highlight result.object.content|safe with query %}

しかし、うまくいきません。

4

5 に答える 5

2

{% ハイライト %} テンプレート タグをロードするのを忘れていませんか?

于 2011-01-30T11:51:51.483 に答える
0

このテンプレート タグは、HTML コードのテキスト部分の単語のみを強調表示します。

import re

from django import template
from django.utils.safestring import mark_safe

register = template.Library()


@register.tag(name="highlight")
def do_highlight(parser, token):
    tag_name, words = token.contents.split(' ', 1)
    nodelist = parser.parse(('endhighlight',))
    parser.delete_first_token()
    return HighlightNode(nodelist, words)

class HighlightNode(template.Node):
    def __init__(self, nodelist, words):
        self.nodelist = nodelist
        self.words = words

    def render(self, context):
        # initial data
        html_data = self.nodelist.render(context)

        # prepare words to be highlighted
        words = context.get(self.words, "")
        if words:
            words = [w for w in re.split('[^\w]+', words) if w]
            pattern = re.compile(r"(?P<filter>%s)" % '|'.join(words), re.IGNORECASE)
        else :
            # no need to go further if there is nothing to highlight
            return html_data

        # parse the html
        chunks = html_data.split('<')
        parsed_data = [chunks.pop(0)]

        # separate tag and text
        for chunk in chunks:
            if chunk:
                if '>' in chunk:
                    tagdata, text = chunk.split('>', 1)
                    endtag = '>'
                else:
                    # the tag didn't end
                    tagdata, text, endtag = chunk, '', ''

                # rebuild tag
                parsed_data.append('<')
                parsed_data.append(tagdata)
                parsed_data.append(endtag)

                # highligh words in text
                if text:
                    text = mark_safe(re.sub(pattern,
                                            r'<span class="highlight">\g<filter></span>',
                                            text))
                    parsed_data.append(text)

        return ''.join(parsed_data)
于 2016-04-26T10:05:59.160 に答える
0

私もこの問題に直面しましたが、回避策はwithタグを使用することです:

{% load highlight %}
{% with obj.text|safe as text %}
    {% highlight text with my_query %}
{% endwith %}

これは私にとってはうまくいきます:)

于 2013-05-06T21:46:50.103 に答える
0

本当に必要なのは、HTML ドキュメント内の単語を強調表示することです。この問題は難しいです (safe を使用しても役に立ちません)。コンテンツが次のとおりであると仮定します。

<h1>my title</h1>
my content

ユーザーcontentが検索ボックスに入力すると、次のようなものが得られます。

<h1>my title</h1>
my <em>content</em>

h1しかし、ちょっと待ってください。ユーザーが検索を入力するとどうなるでしょうか。単純にアルゴリズムを適用すると、次のようになります。

<<em>h1</em>>my title</<em>h1</em>>
my content

したがって、問題を解決するには、ハイライターは次のことを行う必要があります。

  1. HTML を解析します。
  2. 解析されたドキュメントで強調表示します。
  3. ドキュメントを印刷します。

残念ながら、誰かが haystack のためにそのようなハイライターを書いたかどうかはわかりません。しかし、あなたはあなた自身を書くことができます。ここでその方法を説明します: http://django-haystack.readthedocs.org/en/latest/highlighting.html

于 2012-04-06T20:49:07.943 に答える
-1

これが役立つように見えます: Django - {% load .. %} を使用せずにサイト全体の組み込みの templatetag をカスタム タグに置き換える

于 2011-01-29T18:52:13.980 に答える