Поиск значения в содержимом HTML с помощью Django ORM, который не учитывает теги HTML

У меня есть поле в базе данных description эта система будет сохранять HTML-код в нем.

и у меня есть поисковая система, которая работает с Q:

Post.objects.filter(Q(name__icontains=keyword) | Q(description__icontain=keyword))

Он работает нормально, но проблема относится к нему, когда пользователь, например, ищет '<strong>' или же 'strong' он вернет строки, которые имеют '<strong>' слово в них, но он не должен учитывать теги HTML.

Итак, как искать значение в контенте HTML с Django ORM, который не учитывает теги HTML?

3 ответа

Решение

Я думаю, что это хорошее действие

from django.utils.html import strip_tags
rows = Post.objects.filter(Q(name__icontains=keyword) | Q(description__icontain=keyword))
if rows:
    for j,i in enumerate(rows):
        if keyword not in strip_tags(i.name) and keyword not in strip_tags(i.description):
            del rows[j]
return render(request,'posts.html',{'rows':rows})
  1. Извлечение данных из БД с фильтром.
  2. Уберите теги с результатов и отфильтруйте их снова.

Я бы, вероятно, добавил второе поле с именем stripped_description и использовать Джанго striptags фильтр, чтобы удалить HTML-теги, и поиск django по этому полю. Он все равно должен найти строку, в которой нужно вспомнить фактическую description поле, содержащее HTML-код, если вам нужно отобразить его в результате, но это единственное средство, которое я использовал, чтобы "игнорировать" HTML-теги.

Вы можете или, вероятно, должны искать правильную функцию поиска, используя стог сена, моя любимая поисковая система для использования с ней - whoosh (pip install whoosh), если вы не выполняете хардкорные функции поиска. Вы можете определить свой контент для индексации следующим образом:

{{ object.title }}
{{ object.description|strip_tags }}

Его довольно легко настроить, и как только вы это сделаете, настройка для следующего проекта займет несколько минут.

Другие вопросы по тегам