我的Django应用程序中有一个具有自动完成功能的搜索栏,它显示基于用户输入的结果。我把这个搜索栏连接到了三个型号。代码如下:
search_items.html
{% block body %}
<section class="py-3 model-1">
<h2>Model 1</h2>
<hr>
<div class="row">
{% for qa in qa_list %}
<div class="mb-3">{% include 'components/model_1_search.html' %}</div>
{% empty %}
<div class="align-items-center pt-4 mt-4">
<img class="img-fluid mx-auto d-block" src="{% static 'text no results.svg' %}">
</div>
{% endfor %}
</div>
</section>
<section class="py-3 model-2">
<h2>Model 2</h2>
<hr>
<div class="row">
{% for article in article_list %}
<div class="mb-3">{% include 'components/model_2_search.html' %}</div>
{% empty %}
<div class="align-items-center pt-4 mt-4">
<img class="img-fluid mx-auto d-block" src="{% static 'text no results.svg' %}">
</div>
{% endfor %}
</div>
</section>
<section class="py-3 model-3">
<h2>Model 3</h2>
<hr>
<div class="row">
{% for video in video_list %}
<div class="mb-3">{% include 'components/model_3_search.html' %}</div>
{% empty %}
<div class="align-items-center pt-4 mt-4">
<img class="img-fluid mx-auto d-block" src="{% static 'text no results.svg' %}">
</div>
{% endfor %}
</div>
</section>
<hr>views.py
@login_required
def search_address_qa(request):
query = request.GET.get('title')
payload = []
if query:
lookups = Q(title__icontains=query)
address_objects = Article.objects.filter(lookups, status=1).distinct()
address_objects_qa = QA.objects.filter(lookups, status=1).distinct()
for address_object in address_objects or address_objects_qa:
payload.append(address_object.title)
return JsonResponse({'status':200, 'data': payload})
@login_required
def search_items(request):
query = request.GET.get('q')
modelone= ModelOne.objects.filter(title__icontains=query)
modeltwo= ModelTwo.objects.filter(title__icontains=query)
modelthree= ModelThree.objects.filter(title__icontains=query)
if query is not None:
lookups = Q(title__icontains=query) | Q(tags__name__icontains=query) | Q(short_description__icontains=query) | Q(body__icontains=query) | Q(category__title__icontains=query)
modelone = ModelOne.objects.filter(lookups).distinct()
modeltwo = ModelTwo.objects.filter(lookups).distinct()
modelthree= ModelThree.objects.filter(lookups, status=1).distinct()
context = {
'article_list': modelone,
'qa_list': modeltwo,
'video_list': modelthree,
}
return render(request, 'search/search_items.html', context)我不确定这是否是最好的方法,但我目前正在努力显示没有结果,因为我想只显示一个text no results.svg,如果没有结果在3个模型。
此外,如果只在Model 1中找到一个对象,那么我想隐藏Model 2和Model 3。同样的规则应该适用于Model 2和Model 3,所以如果我只在Model 2中找到一个对象,那么Model 1和Model 2部分就会消失。
发布于 2022-02-18 11:09:56
只需评估游戏的状态,并通过上下文传递它。
count1 = modelone.count()
count2 = modeltwo.count()
count3 = modelthree.count()
no_results = (count1 == 0 and count2 == 0 and count3 == 0)
context = {
'no_results' : no_results,
'article_list': modelone,
'qa_list': modeltwo,
'video_list': modelthree,
}问题的另一部分是不正确的。仅在模型1中而不是在模型2中找到对象意味着什么?从定义上看,它们是不同的模型类型,因此它们在哪些方面被认为是相同的?一旦您可以用Python表示这一点,在呈现模板之前对其进行评估,这样它就可以很容易地用简单的if测试来表示不呈现的内容。
{% if no_results %}
display no results.svg
{% else %}
...
{% endif %}其他可能有帮助的事情。您可以使用queryset.none()将一个查询集呈现为空(因此,在其上迭代的模板{% for x in queryset %}迭代零次,如果存在,则呈现{% empty %}部件。
发布于 2022-02-18 12:03:30
您可以直接呈现到模板中,而不是计算这么多东西。你可以这样做:
{% if article_list %}
show result here
{% else %}
display no results.svg
{% endif %}
{% if qa_list %}
show result here
{% else %}
display no results.svg
{% endif %}
{% if video_list %}
show result here
{% else %}
display no results.svg
{% endif %}如果为空,则if标记将计算为false。这将减少.count()计算,并发送更多变量。
https://stackoverflow.com/questions/71172129
复制相似问题