如何在Django模板中调用视图循环处理后的modela_completed变量?
问题:Django模板无法正确引用循环内赋值的modela_completed变量
你当前的问题核心在于:视图里的modela_completed是单个变量,循环结束后仅保留最后一次循环的结果,模板遍历q_2时,每个ModelA实例无法对应自己的modela_completed状态,导致模板显示的值始终是最后一次循环的结果(或初始值0)。
以下是两种可行的解决方案:
方法一:给ModelA实例动态添加属性
直接在视图中给每个ModelA实例绑定completed属性,模板可直接访问该属性。
修改后的视图代码
def function(request, modeld_id): q_1 = ModelD.objects.get(pk=modeld_id) q_2 = q_1.name.modela.all() modela_count = q_2.count() modeld_accepted_on = get_object_or_404(ModelD, pk=modeld_id) for modela in q_2: latest_point = None # 初始化默认状态为0 modela.completed = 0 # 过滤当前用户的ModelB记录 modelb_records = modela.modelb_set.filter(user=request.user.userprofile) for in_modela in modelb_records: if latest_point is None or in_modela.created_at > latest_point: latest_point = in_modela.created_at # 遍历完ModelB后判断是否满足条件 if latest_point is not None and latest_point > modeld_accepted_on.accepted_on: modela.completed = 1 print(f'Points for modela- {modela} - {modela.completed}') return render(request, "template.html", { 'modeld_accepted_on': modeld_accepted_on, 'modela_count': modela_count, 'q_2': q_2 })
修改后的模板代码
{% for modela in q_2 %} <!-- 直接访问每个modela实例的completed属性 --> {{ modela.completed }} {% for in_modela in modela.modelb_set.all %} <!-- 此处可保留原有逻辑,无需额外修改 --> {% endfor %} {% endfor %}
方法二:用字典存储每个ModelA的状态
若不想修改模型实例,可创建字典存储每个ModelA的完成状态,模板通过ID取值。
修改后的视图代码
def function(request, modeld_id): q_1 = ModelD.objects.get(pk=modeld_id) q_2 = q_1.name.modela.all() modela_count = q_2.count() modeld_accepted_on = get_object_or_404(ModelD, pk=modeld_id) # 字典存储每个modela的完成状态,键为modela的id modela_completed_dict = {} for modela in q_2: latest_point = None completed = 0 modelb_records = modela.modelb_set.filter(user=request.user.userprofile) for in_modela in modelb_records: if latest_point is None or in_modela.created_at > latest_point: latest_point = in_modela.created_at if latest_point is not None and latest_point > modeld_accepted_on.accepted_on: completed = 1 print(f'Points for modela- {modela} - {completed}') modela_completed_dict[modela.id] = completed return render(request, "template.html", { 'modeld_accepted_on': modeld_accepted_on, 'modela_count': modela_count, 'q_2': q_2, 'modela_completed_dict': modela_completed_dict })
修改后的模板代码
首先需要自定义模板过滤器(Django默认没有字典按key取值的过滤器):
- 在你的app目录下创建
templatetags文件夹,新建custom_filters.py文件:
from django import template register = template.Library() @register.filter def get_item(dictionary, key): return dictionary.get(key, 0)
- 在模板开头加载过滤器,然后取值:
{% load custom_filters %} {% for modela in q_2 %} <!-- 通过modela的id从字典中获取对应状态 --> {{ modela_completed_dict|get_item:modela.id }} {% for in_modela in modela.modelb_set.all %} <!-- 此处可保留原有逻辑 --> {% endfor %} {% endfor %}
原代码问题分析
你之前的代码中,modela_completed是单个变量,每次循环都会覆盖它的值,最终传给模板的是最后一次循环的结果。如果最后一个ModelA不满足条件,模板就会显示0,导致所有ModelA实例都对应同一个错误值。
内容的提问来源于stack exchange,提问作者PhilM
相关产品推荐
相关产品推荐

