如何在Django模板的for循环中访问视图层动态生成的上下文变量
解决方案
以下方案按实现成本、可维护性从优到劣排序:
方案1:视图层统一封装分类计数(最推荐)
直接把分类类型、分类名称、对应文章数打包为统一的结构传入模板,逻辑最清晰,不需要额外模板功能支持。
修改后视图代码:
context['categories'] = [] for category_type, category_name in choices.CATEGORIES: article_count = Article.objects.filter(category=category_type).count() # 按顺序存分类类型、分类名、文章数 context['categories'].append( (category_type, category_name, article_count) )
对应模板代码:
{% for type, category, count in categories %} <a href="{% url 'app:category' type %}">{{category}}</a> 文章数:{{count}} {% endfor %}
方案2:视图层单独存储计数字典
如果不想修改原有categories的结构,可以单独把所有分类的计数存在一个字典传入模板,改动量极小。
修改后视图代码:
context['categories'] = choices.CATEGORIES # 新增计数字典 context['category_counts'] = {} for category_type, category in context['categories']: context['category_counts'][category_type] = Article.objects.filter(category=category_type).count()
对应模板代码,直接用循环拿到的type作为键访问字典即可:
{% for type, category in categories %} <a href="{% url 'app:category' type %}">{{category}}</a> 文章数:{{category_counts[type]}} {% endfor %}
方案3:模板层自定义过滤器(不推荐)
如果完全不允许修改视图层代码,可以通过自定义模板过滤器实现从上下文读取动态变量,但需要额外开发模板标签,维护成本更高。
- 先在应用下创建
templatetags/custom_filters.py,代码如下:
from django import template register = template.Library() @register.simple_tag(takes_context=True) def get_dynamic_count(context, key): return context.get(key, 0)
- 模板开头加载自定义标签,调用标签传入动态key即可:
{% load custom_filters %} {% for type, category in categories %} <a href="{% url 'app:category' type %}">{{category}}</a> 文章数:{% get_dynamic_count type %} {% endfor %}
内容的提问来源于stack exchange,提问作者dimitri
相关产品推荐
相关产品推荐

