Solution 1 :

multiple query you have to use pipe symbol instead of comma

posts = AdPost.objects.filter(
        Q(category__icontains=q)|
        Q(sub_category__icontains=q)|
        Q(detail__icontains=q)
    ).distinct()

Problem :

I am working on a search functionality. I am trying to query multiple fields from database using django 3.0. Whenever I run the code I am getting ‘No results found for: “” ‘. What could be wrong with my code?

Here is my code:

views.py

def search(query=None):
queryset = []
queries = query.split(" ")
for q in queries:
    posts = AdPost.objects.filter(
        Q(category__icontains=q),
        Q(sub_category__icontains=q),
        Q(detail__icontains=q),
    ).distinct()

    for post in posts:
        queryset.append(post)

    return list(set(queryset))


  def home(request):
context = {}

query = " "
if request.GET:
    query = request.GET['q']
    context['query'] = str(query)

ad_posts = sorted(search(query), key=attrgetter('date_updated'), reverse=True)
context['ad_posts'] = ad_posts

user = request.user

if not user.is_authenticated:
    return redirect('login')
form = PostForm(request.POST or None, request.FILES or None)
if form.is_valid():
    obj = form.save(commit=False)
    obj.author = user
    obj.save()
    form = PostForm()

context['post_form'] = form

return render(request, 'posts/home.html', context)

home.html

 <div class="content">
      {% if ad_posts %}
          {% for post in ad_posts %}
             <div>
                {% include 'snippets/post_link.html' with ad_post=post %}
              </div>
           {% endfor %}
           {% else %}
              <div>
                 {% include 'snippets/post_link.html' with query=post %}
              </div>
           {% endif %}
  </div>

snippets/post_link.html

{% if ad_posts %}
    <div class="card">
        <p><b>{{post.author.name}}</b> {{post.date_published}}</p>
        <p>{{post.detail}}</p>
    </div>
{% else %}
   <div class="card">
      <h4>No results found for: "{{query}}"</h4>
   </div>
{% endif %}

search form is located in base.html

<form class="">
  <input type="search" name="q" id="id_q" value="{{query}}">
  <button type="submit">Submit</button>
</form>

By