Django模板无法获取中间模型clientvul的path字段值问题
解决Django模板访问多对多中间模型字段的问题
问题根源
直接遍历row.vuls.all()只能获取关联的Vul模型实例,无法自动携带中间模型ClientVul的字段数据,所以你看到的path为空。
解决步骤
1. 调整视图的预取逻辑
如果要同时获取中间模型数据,需要预取中间模型的关联集合,而不是仅预取Vul对象。可以修改视图中的查询:
from django.db.models import Prefetch # 方式1:直接预取中间模型的反向关联 clients = Client.objects.prefetch_related('clientvul_set').all() # 方式2:用Prefetch精准控制,同时预取关联的Vul对象(优化查询性能) clients = Client.objects.prefetch_related( Prefetch('clientvul_set', queryset=ClientVul.objects.select_related('vul')) ).all()
注:clientvul_set是Django默认的反向关联名称,如果你在ClientVul模型的client字段里设置了related_name,就用你设置的名称替代。
2. 修改模板遍历逻辑
不再遍历vuls.all(),而是遍历中间模型的集合,这样就能直接访问path字段,同时通过中间模型关联到Vul实例:
{% for client_vul in row.clientvul_set.all %} <p>漏洞名称: {{ client_vul.vul.name }}</p> <p>路径: {{ client_vul.path }}</p> {% endfor %}
额外提示
如果你的ClientVul模型里给client字段设置了related_name='client_vuls',那模板里就改成row.client_vuls.all(),写法更直观。
内容的提问来源于stack exchange,提问作者jonat-han
相关产品推荐
相关产品推荐

