Одновременный поиск по нескольким тегам
Я создаю небольшое приложение для социальных сетей. Я делаю функцию поиска нескольких постов с использованием нескольких тегов, например: first_post , second_post
. И он получит все посты, которые связаны с искомыми тегами.
Когда я ищу по одному тегу, он работает нормально, но когда я ищу по двум тегам, он не работает (ничего не показывает).
models.py
class UserPost(models.Model):
post_creater = models.ForeignKey(User, on_delete=models.CASCADE)
tags = TaggableManager()
body = models.CharField(max_length=30,default='')
views.py
def search_posts(request):
search_it = request.GET.get('q')
items = ''
if search_it:
items = UserPost.objects.filter(tags__name__icontains=search_it)
context = {'items': items}
return render(request, 'search_posts.html', context)
Когда я ищу просто one item
например post_1
тогда он показывает все посты НО когда я ищу два тега например :- post_1 , post_2
тогда он ничего не показывает
Я также пробовал использовать метод split :-
search_it = search_it.split('+')
НО он все еще показывает пустое место.
Я буду очень признателен за вашу помощь. Спасибо
Доброе утро, вы не можете использовать иконки со списком, но вы можете использовать оператор Q вот так:
from django.db.models import Q
def search_posts(request):
tag_names = request.GET.get('q')
items = ''
if tag_names:
query = Q()
for tag_name in tag_names:
query |= Q(tags__name__icontains=tag_name)
items = UserPost.objects.filter(query)
context = {'items': items}
return render(request, 'search_posts.html', context)
В дополнение к другому ответу, вам, вероятно, придется использовать getlist
, если вы передаете список поисковых терминов через запятую (например, .../?q=tag1,tag2,tag3
). Документация для этого приведена здесь.
То есть что-то вроде этого:
from django.db.models import Q
def search_posts(request):
# use getlist to automatically parse a list of values from querystring
search_terms = request.GET.getlist('q')
if search_terms:
# build the query up, with a Q for each search term
query = Q()
for term in search_terms:
query |= Q(tags__name__icontains=term)
# filter the UserPosts with the search
items = UserPost.objects.filter(query)
else:
items = UserPost.objects.all()
context = {'items': items}
return render(request, 'search_posts.html', context)