Пользовательский шаблонный фильтр: замените элемент HTML фильтрованным по регулярному выражению текстом (Django 2.1) - PullRequest
0 голосов
/ 03 февраля 2019

Я создаю поисковую систему, которой нужен настраиваемый фильтр, отображающий текст, окружающий ключевое слово, например выдержки на странице результатов Google.Я использую регулярное выражение для определения окружающих слов.Вот мой код для фильтра:

@register.filter(needs_autoescape=True)
@stringfilter
def show_excerpt (value, search_term, autoescape=True):
    # make the keyword put into the search engine case insensitive #
    keywords = re.compile(re.escape(search_term), re.IGNORECASE)
    # make excerpt return 300 characters before and after keyword #
    excerpt_text = '.{300}' + str(keywords) + '.{300}'
    # replace the original text with excerpt #
    excerpt = value.sub(excerpt_text, value)
    return mark_safe(excerpt)

Код для поисковой системы в view.py:

def query_search(request):
    articles = cross_currents.objects.all()
    search_term = ''
    if 'keyword' in request.GET:
        search_term = request.GET['keyword']
        articles = articles.annotate(similarity=Greatest(TrigramSimilarity('Title', search_term), TrigramSimilarity('Content', search_term))).filter(similarity__gte=0.03).order_by('-similarity')
    context = {'articles': articles, 'search_term': search_term}
    return render(request, 'query_search.html', context)

HTML-шаблоне (он включает в себя пользовательский highlight фильтр, который выделяетключевое слово, введенное в поисковую систему):

<ul>
{% for article in articles %}
<li><a href="{% url 'search:article_detail' article.ArticleID %}">{{ article|highlight:search_term }}</a></li>
<p> {{ article.Content|highlight:search_term|show_excerpt:search_term }} </p>
{% endfor %}
</ul>

Сообщение об ошибке: у объекта SafeText нет атрибута sub '

Я думаю, что я делаю .sub неправильно.Мне просто нужна выдержка, чтобы заменить весь оригинальный текст (текст, на который я помещаю фильтр).Исходный текст начинается с начала данных, но я просто хочу отобразить данные, окружающие ключевое слово, с моим пользовательским фильтром highlight, выделяющим ключевое слово (как в Google).Любая идея?

РЕДАКТИРОВАТЬ: когда я делаю re.sub(excerpt_text, value), я получаю сообщение об ошибке sub () пропускает 1 обязательный позиционный аргумент: 'string'.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Я решил отказаться от регулярных выражений и просто сделать хорошую старую нарезку строк.Рабочий код для фильтра:

@register.filter(needs_autoescape=True)
@stringfilter
def show_excerpt(value, search_term, autoescape=True):
    #make data into string and lower#
    original_text = str(value)
    lower_original_text = original_text.lower()
    #make keyword into string and lower#
    keyword_string = str(search_term)
    lower_keyword_string = keyword_string.lower()
    #find the position of the keyword in the data#
    keyword_index = lower_original_text.find(lower_keyword_string)
    #Specify the begining and ending positions of the excerpt#
    start_index = keyword_index - 10
    end_index = keyword_index + 300
    #Define the position range of excerpt#
    excerpt = original_text[start_index:end_index]
    return mark_safe(excerpt)
0 голосов
/ 03 февраля 2019

Вам необходимо вызвать re.sub (), а не value.sub ().Вы вызываете sub для объекта SafeText, .sub () является функцией регулярного выражения.

Я не проверял ваш код, но если оставшийся код верен, вы должны просто изменить эту строку на re.sub(excerpt_text, value)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...