Django Haystack を使用して自分のサイトで検索を行っていますが、TextField のすべての html コードをテンプレート フィルター"safe"でフィルター処理し、検索基準に従って検索結果を強調表示する必要があります。
これを行う方法はありますか?私は試してみました
{% highlight result.object.content|safe with query %}
しかし、うまくいきません。
Django Haystack を使用して自分のサイトで検索を行っていますが、TextField のすべての html コードをテンプレート フィルター"safe"でフィルター処理し、検索基準に従って検索結果を強調表示する必要があります。
これを行う方法はありますか?私は試してみました
{% highlight result.object.content|safe with query %}
しかし、うまくいきません。
{% ハイライト %} テンプレート タグをロードするのを忘れていませんか?
このテンプレート タグは、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)
私もこの問題に直面しましたが、回避策はwithタグを使用することです:
{% load highlight %}
{% with obj.text|safe as text %}
{% highlight text with my_query %}
{% endwith %}
これは私にとってはうまくいきます:)
本当に必要なのは、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
したがって、問題を解決するには、ハイライターは次のことを行う必要があります。
残念ながら、誰かが haystack のためにそのようなハイライターを書いたかどうかはわかりません。しかし、あなたはあなた自身を書くことができます。ここでその方法を説明します: http://django-haystack.readthedocs.org/en/latest/highlighting.html