2011-01-29 13 views
4

私はDjango Haystackを使用して自分のサイトで検索していますが、テンプレートフィルタ"safe"でTextFieldのすべてのHTMLコードをフィルタリングし、 。ハイライトテンプレートタグ付きの安全なフィルタdjango-haystack

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

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

しかし、動作しません。

+0

私も同じ問題に直面しています。誰かが何か提案してもらえますか? –

答えて

1

いけないあなたは、{%のハイライト%}テンプレートタグをロードするために忘れてしまったら?

+2

いいえ、それは完全に動作しますが、ハイライトを使用するとテンプレートのHTMLコードが表示されます – eos87

0

あなたが本当にしたいのは、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 

をそう問題ハイライトすべきあなたを解決するために:

  1. 解析HTML。
  2. ハイライトされたドキュメントです。
  3. 文書を印刷します。

不幸にも、誰かがhaystack用にハイライターを書いているのかどうかわかりません。しかし、あなたは自分自身を書くことができます。私もこの問題に直面し、回避策がwithタグを使用することができhttp://django-haystack.readthedocs.org/en/latest/highlighting.html

0

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

これが私の作品:)

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) 
関連する問題