Безопасен филтър с шаблонен маркер за подчертаване django-haystack

Използвам Django Haystack, за да правя търсене в моя сайт, но трябва да филтрирам целия html код на моето TextField с шаблонния филтър "safe" и маркирайте резултатите от търсенето според критериите за търсене.

Има ли начин това да стане? Опитах с

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

но не става.


person eos87    schedule 29.01.2011    source източник


Отговори (5)


Не сте ли забравили да заредите {% highlight %} таг за шаблон?

person errx    schedule 30.01.2011
comment
не, работи перфектно, но мога да видя html кода в моя шаблон, когато използвам осветяването - person eos87; 31.01.2011

Това, което наистина искате, е да маркирате думи в 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. Отпечатайте документ.

За съжаление не знам дали някой е писал такъв хайлайтър за купа сено. Но можете да напишете своя собствена. Тук е обяснено как: http://django-haystack.readthedocs.org/en/latest/highlighting.html

person Tomasz Wysocki    schedule 06.04.2012

Аз също се сблъсках с този проблем и заобиколното решение може да бъде да използвам с етикет:

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

Това работи за мен :)

person Aamir Adnan    schedule 06.05.2013

Този шаблонен етикет ще маркира думи само за текстовата част на вашия 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)
person Sam A.    schedule 26.04.2016

Изглежда, че това може да ви помогне: Django - замяна на вграден шаблонен етикет с потребителски етикет за цял сайт без {% load .. %}

person Dolan Antenucci    schedule 29.01.2011