Поиск значения в содержимом 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})
- Извлечение данных из БД с фильтром.
- Уберите теги с результатов и отфильтруйте их снова.
Я бы, вероятно, добавил второе поле с именем stripped_description
и использовать Джанго striptags
фильтр, чтобы удалить HTML-теги, и поиск django по этому полю. Он все равно должен найти строку, в которой нужно вспомнить фактическую description
поле, содержащее HTML-код, если вам нужно отобразить его в результате, но это единственное средство, которое я использовал, чтобы "игнорировать" HTML-теги.
Вы можете или, вероятно, должны искать правильную функцию поиска, используя стог сена, моя любимая поисковая система для использования с ней - whoosh (pip install whoosh), если вы не выполняете хардкорные функции поиска. Вы можете определить свой контент для индексации следующим образом:
{{ object.title }}
{{ object.description|strip_tags }}
Его довольно легко настроить, и как только вы это сделаете, настройка для следующего проекта займет несколько минут.