Одновременный поиск по нескольким тегам

Я создаю небольшое приложение для социальных сетей. Я делаю функцию поиска нескольких постов с использованием нескольких тегов, например: 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)
Вернуться на верх