我想根据感兴趣的特定水果显示请求列表。所以我写了一个列表视图,条件是它应该显示包括芒果的列表,否则,它应该显示包括香蕉的列表。因此,当我渲染模板时,模板应检查其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包括香蕉的请求列表将显示。但只有芒果清单有效。请帮助。...
答案 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>