【问题标题】:display list based on the conditional listview statement in django views using the same template使用相同模板在 django 视图中基于条件 listview 语句显示列表
【发布时间】:2019-10-19 06:35:14
【问题描述】:

我想根据感兴趣的特定水果显示请求列表。所以我写了一个列表视图,条件是它应该显示包含芒果的列表,否则它应该显示包含香蕉的列表。所以当我渲染模板时,模板应该检查它的 mango_list 还是banana_list。但只有 mango_list 显示。视图中的 else 语句不起作用

如果上下文是 mango_list,我在视图中编写了条件语句来渲染 mango_list,否则显示香蕉列表。并将条件放入模板中。

下面是我的代码

views.py

def fruit_list_view(request):
    mango_list = Request.objects.filter(taste__icontains='mango')
    banana_list = Request.objects.filter(taste__icontains='banana')
    context ={
        'mango_list': mango_list,
        'banana_list': banana_list,
        }
    if mango_list in context.values():
        return render(request,"frCat_list.html",context={'mango_list': mango_list})
    else:
        return render(request,"frCat_list.html",context={'banana_list': banana_list})

url.py

urlpatterns = [

    path('', views.index, name='index'),
    path('mango_list/', views.fruit_list_view, name='mango_list'),
    path('banana_list/', views.fruit_list_view, name='banana_list'),
]

模板文件(模板名称为 frCat_list.html)

{% extends 'base_generic.html' %}
{% load static %}
{% block content %}


<body>
{% if mango_list %}
    {% for request in mango_list %}
  <tbody> 

      <td><a href="{% url 'request-detail' request.id %}">{{request.id}}</a></td>
      <td>{{request.price}}</td>
      <td>{{request.size}}</td>
      <td>{{request.comment}}</td>

  </tbody>
  {% endfor %}
  </table>
{% elif banana_list %}
    {% for request in banana_list %}
  <tbody> 

      <td><a href="{% url 'request-detail' request.id %}">{{request.id}}</a></td>
      <td>{{request.colour}}</td>
      <td>{{request.size}}</td>
      <td>{{request.comment}}</td>

  </tbody>
  {% endfor %}
  </table>

  {% else %}
    <p>There are no such fruit available.</p>
  {% endif %}

</body>      

{% endblock %}

我希望在我的模板中看到条件语句。当它的 mango_list 时,将显示包括 manago 在内的请求列表,当它的 banan_list 时,将显示包括香蕉在内的请求列表。但只有芒果列表有效。请帮忙....

【问题讨论】:

    标签: django django-templates django-views


    【解决方案1】:

    您可以通过从url(..) 传递参数来简化它。首先我们可以像这样定义视图函数:

    def fruit_list_view(request, taste):
        context = {
            '{}_list'.format(taste): Request.objects.filter(taste__icontains=taste)
        }
        return render(request,"frCat_list.html",context=context)

    然后在urls.py 中,我们可以将taste 的值传递给url(..) [Django-doc]

    # app/urls.py
    
    urlpatterns = [
        path('', views.index, name='index'),
        path('mango_list/', views.fruit_list_view, kwargs={'taste': 'mango'}, name='mango_list'),
        path('banana_list/', views.fruit_list_view, kwargs={'taste': 'banana'}, name='banana_list'),
    ]

    请在您的模板中不要将变量命名为request,因为Django 将一个名为request 的变量传递给模板。由于两者看起来非常相似,因此最好为产品使用一个名称,并以不同的方式消除歧义。

    不过,始终使用相同的变量 list 并始终使用该列表进行渲染似乎更有意义,例如:

    def fruit_list_view(request, taste):
        context = {
            'item_list': Request.objects.filter(taste__icontains=taste)
        }
        return render(request,"frCat_list.html",context=context)

    然后我们可以在模板中渲染它:

    <body>
    {% if list %}
        {% for item in item_list %}
      <tbody> 
    
          <td><a href="{% url 'request-detail' item.id %}">{{item.id}}</a></td>
          <td>{{item.price}}</td>
          <td>{{item.size}}</td>
          <td>{{item.comment}}</td>
    
      </tbody>
      {% endfor %}
      </table>
    {% endif %}
    </body>

    【讨论】:

    • 您对模板中有关“请求”的评论已得到很好的记录。比你!
    • 如何减少模板中的代码,因为会迭代很多查询集。我尝试了以下没有用的方法。
    • combined_list = list(chain('mango_list', 'banana_list') 我的模板低于 {% for sr in combine_list %} {% if mango_list or banana_list %} {{request.id}} {{request.price}} {{request.size}} {{request.comment}} {% else %}

      没有可用的服务请求。

      {% endif %} {% endfor %}
    猜你喜欢
    • 2019-10-05
    • 2018-12-25
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多