首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django在没有结果时隐藏整个区段

django在没有结果时隐藏整个区段
EN

Stack Overflow用户
提问于 2022-02-18 10:43:38
回答 2查看 195关注 0票数 0

我的Django应用程序中有一个具有自动完成功能的搜索栏,它显示基于用户输入的结果。我把这个搜索栏连接到了三个型号。代码如下:

search_items.html

代码语言:javascript
复制
 {% 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

代码语言:javascript
复制
@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 2Model 3。同样的规则应该适用于Model 2Model 3,所以如果我只在Model 2中找到一个对象,那么Model 1和Model 2部分就会消失。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-18 11:09:56

只需评估游戏的状态,并通过上下文传递它。

代码语言:javascript
复制
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测试来表示不呈现的内容。

代码语言:javascript
复制
{% if no_results %}
    display no results.svg
{% else %}
    ...
{% endif %}

其他可能有帮助的事情。您可以使用queryset.none()将一个查询集呈现为空(因此,在其上迭代的模板{% for x in queryset %}迭代零次,如果存在,则呈现{% empty %}部件。

票数 0
EN

Stack Overflow用户

发布于 2022-02-18 12:03:30

您可以直接呈现到模板中,而不是计算这么多东西。你可以这样做:

代码语言:javascript
复制
{% 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()计算,并发送更多变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71172129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档