I hope you're well. I've created a global search with more than one model in different app.
Post models belongs to Nutriscore folder
UserProfile models belongs to User folder
If I use a word which cover Post and UserProfile search, for instance Main courses. I got some search result (3 results) for UserProfile but nothing appears for Post (whereas count gives me 6 results). So I don't know what's wrong in code?
user/views.py
# global search
class GlobalSearchView(ListView):
template_name = 'search_global.html'
count = 0
countnutri = 0
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
context['count'] = self.count or 0
context['countnutri'] = self.countnutri or 0
context['query'] = self.request.GET.get('q')
return context
def get_queryset(self): # new
query = self.request.GET.get('q', None)
if query is not None:
nutriscore = Post.objects.filter(
Q(title__icontains=query) | Q(slug__icontains=query) | Q(typederepas__name__icontains=query) | Q(prixrepas__name__icontains=query) | Q(vitesserepas__name__icontains=query) | Q(force__name__icontains=query) | Q(bienfaitrepas__name__icontains=query)
).distinct()
user = UserProfile.objects.filter(
Q(pays__icontains=query) | Q(town__icontains=query) | Q(user__username__icontains=query) | Q(mealtrend__name__icontains=query) | Q(pricetrend__name__icontains=query) | Q(speedtrend__name__icontains=query)| Q(strengthtrend__name__icontains=query) | Q(wellnesstrend__name__icontains=query)
).distinct()
results = chain(nutriscore,user)
qs = sorted(user,
key=lambda instance: instance.pk,
reverse=True)
self.count = len(qs)
qn = sorted(nutriscore,
key=lambda instance: instance.pk,
reverse=True)
self.countnutri = len(qn)
return qs
return qn
return results
user/urls.py
path('search/', GlobalSearchView.as_view(),name="global_search"),
user/templates/global_search.html I got a menu with display / collapse function in css.
<div class="row" id="collapseNutriscore">
{% for object in object_list %}
{% with object|class_name as klass %}
{% if klass == 'Post' %}
{{ object.title }}
{% endif %}
{% endwith %}
{% endfor %}
</div>
<br>
<br>
<div class="row collapse" id="collapseCooker">
{% for object in object_list %}
{% with object|class_name as klass %}
{% if klass == 'UserProfile' %}
{{ object.user.username }}
{% endif %}
{% endwith %}
{% endfor %}
</div>