没有结果时django隐藏整个部分
django hide whole section when there is no result
我的 Django 应用程序中有一个具有自动完成功能的搜索栏,它根据用户输入显示结果。我将此搜索栏连接到 3 个模型。代码如下:
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)
我不确定这是否是最好的方法,但我目前正在努力解决没有显示结果的问题,因为如果 3 个模型中没有结果,我只想显示一个 text no results.svg
。
此外,如果只在Model 1
中找到一个对象,那么我想隐藏Model 2
和Model 3
。同样的规则应该适用于 Model 2
和 Model 3
所以如果我只在 Model 2
中找到一个对象那么 Model
1 和 Model 2
部分应该消失
只是评估播放状态并通过上下文传递它。
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,
}
问题的另一部分是ill-formed。仅在模型 1 中找到对象而在模型 2 中找不到对象是什么意思?根据定义,它们是不同的模型类型,因此在哪些方面它们被认为是相同的?一旦你可以在 Python 中表达它,在渲染你的模板之前对其进行评估,这样它就可以很容易地表达不在简单的 if 测试
中渲染的内容
{% if no_results %}
display no results.svg
{% else %}
...
{% endif %}
其他可能有帮助的事情。您可以使用 queryset.none()
渲染一个空的查询集(因此迭代它的模板 {% for x in queryset %}
迭代零次并渲染 {% empty %}
部分(如果存在)。
你可以直接渲染到模板中而不用计算那么多东西。您可以按如下方式进行:
{% 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() 计算并发送更多变量。
我的 Django 应用程序中有一个具有自动完成功能的搜索栏,它根据用户输入显示结果。我将此搜索栏连接到 3 个模型。代码如下:
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)
我不确定这是否是最好的方法,但我目前正在努力解决没有显示结果的问题,因为如果 3 个模型中没有结果,我只想显示一个 text no results.svg
。
此外,如果只在Model 1
中找到一个对象,那么我想隐藏Model 2
和Model 3
。同样的规则应该适用于 Model 2
和 Model 3
所以如果我只在 Model 2
中找到一个对象那么 Model
1 和 Model 2
部分应该消失
只是评估播放状态并通过上下文传递它。
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,
}
问题的另一部分是ill-formed。仅在模型 1 中找到对象而在模型 2 中找不到对象是什么意思?根据定义,它们是不同的模型类型,因此在哪些方面它们被认为是相同的?一旦你可以在 Python 中表达它,在渲染你的模板之前对其进行评估,这样它就可以很容易地表达不在简单的 if 测试
中渲染的内容{% if no_results %}
display no results.svg
{% else %}
...
{% endif %}
其他可能有帮助的事情。您可以使用 queryset.none()
渲染一个空的查询集(因此迭代它的模板 {% for x in queryset %}
迭代零次并渲染 {% empty %}
部分(如果存在)。
你可以直接渲染到模板中而不用计算那么多东西。您可以按如下方式进行:
{% 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() 计算并发送更多变量。