私はDjango Haystackを使用して自分のサイトで検索していますが、テンプレートフィルタ"safe"でTextFieldのすべてのHTMLコードをフィルタリングし、 。ハイライトテンプレートタグ付きの安全なフィルタdjango-haystack
これを行う方法はありますか?私は試しました
{% highlight result.object.content|safe with query %}
しかし、動作しません。
私はDjango Haystackを使用して自分のサイトで検索していますが、テンプレートフィルタ"safe"でTextFieldのすべてのHTMLコードをフィルタリングし、 。ハイライトテンプレートタグ付きの安全なフィルタdjango-haystack
これを行う方法はありますか?私は試しました
{% highlight result.object.content|safe with query %}
しかし、動作しません。
これはあなたを助けるかもしれないように見えます: Django - replacing built-in templatetag by custom tag for a whole site without {% load .. %}
いけないあなたは、{%のハイライト%}テンプレートタグをロードするために忘れてしまったら?
いいえ、それは完全に動作しますが、ハイライトを使用するとテンプレートのHTMLコードが表示されます – eos87
あなたが本当にしたいのは、HTML文書の単語を強調表示することです。この問題は難しいです(セーフを使用するとあなたを助けません)。
<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用にハイライターを書いているのかどうかわかりません。しかし、あなたは自分自身を書くことができます。私もこの問題に直面し、回避策がwithタグを使用することができhttp://django-haystack.readthedocs.org/en/latest/highlighting.html
:
{% load highlight %}
{% with obj.text|safe as text %}
{% highlight text with my_query %}
{% endwith %}
これが私の作品:)
このテンプレートタグは言葉だけをハイライト表示されますここでどのように説明されています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)
私も同じ問題に直面しています。誰かが何か提案してもらえますか? –