使用相同模板在django视图中基于条件listview语句显示列表

时间:2019-06-03 17:18:25

标签: django django-templates django-views

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

如果上下文是mango_list,我在视图中写了条件语句以渲染mango_list,否则显示banana_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包括芒果的请求列表将显示,而当其banana_list包括香蕉的请求列表将显示。但只有芒果清单有效。请帮助。...

1 个答案:

答案 0 :(得分:0)

您可以通过传递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>