You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:模板层自定义过滤器(不推荐)

如果完全不允许修改视图层代码,可以通过自定义模板过滤器实现从上下文读取动态变量,但需要额外开发模板标签,维护成本更高。

  1. 先在应用下创建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)
  1. 模板开头加载自定义标签,调用标签传入动态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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:48:02