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()
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()
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>