Python Django ManyToManyField引用自:渲染到模板
下面是我正在从事的一个项目的代码。正如您在视图中看到的,我正在运行风险模型中与Url中主键关联的对象的查询 问题是我无法访问被查询对象的属性 型号Python Django ManyToManyField引用自:渲染到模板,python,django,django-models,django-templates,django-views,Python,Django,Django Models,Django Templates,Django Views,下面是我正在从事的一个项目的代码。正如您在视图中看到的,我正在运行风险模型中与Url中主键关联的对象的查询 问题是我无法访问被查询对象的属性 型号 class Risk(models.Model): risk_title = models.CharField(max_length=60) root_causes = models.ManyToManyField('self', through='Ro
class Risk(models.Model):
risk_title = models.CharField(max_length=60)
root_causes = models.ManyToManyField('self',
through='Roots',
symmetrical=False,
related_name='root_cause')
class Roots(models.Model):
causal_risk = models.ForeignKey(Risk, related_name='causes', on_delete=models.CASCADE)
effected_risk = models.ForeignKey(Risk, related_name='effected_risk', on_delete=models.CASCADE)
查看:
def view_risk(request, id):
try:
risk = Risk.objects.get(pk=id)
except Risk.DoesNotExist:
raise Http404("Risk does not exist")
roots = Roots.objects.filter(effected_risk=id)
args = {
'risk': risk,
'roots': roots,
}
return render(request, 'risks/risk_detail.html', args)
{% for root in roots %}
{{ root }}
{% endfor %}
模板:
def view_risk(request, id):
try:
risk = Risk.objects.get(pk=id)
except Risk.DoesNotExist:
raise Http404("Risk does not exist")
roots = Roots.objects.filter(effected_risk=id)
args = {
'risk': risk,
'roots': roots,
}
return render(request, 'risks/risk_detail.html', args)
{% for root in roots %}
{{ root }}
{% endfor %}
运行上述代码将返回以下结果:
Roots object (2) Roots object (3)
这应该是意料之中的,因为这些是我通过管理界面对模型所做的输入
但是,当我跑步时:
{% for root in roots %}
{{ root.risk_title }}
{% endfor %}
屏幕空白
TLDR
将查询从中间表传递到模板可以工作,但模板无法访问对象属性。如何运行上述查询,然后访问模板中的对象
更新的包含了JoJo响应中的渲染部分。此问题已在我的其他更新中解决
提前谢谢你 注意,view函数缺少
return
语句,因此实际上根本没有呈现html页面
假设模板html名为'my_template.html'
,则缺少的返回值应类似于:
def视图_风险(请求,id):
# ...
返回渲染(请求'my_template.html',args)
此外,正如@JonHrovat所提到的,模板需要调用
{{ root.causal_risk.risk_title }}
在for循环中
关于效率的说明:
如果使用当前对根的查询调用模板中的root.因果\u risk.risk\u title
,这将导致额外的查询,每个迭代一个查询。通过在view函数中查询根时使用以下语句可以避免这种情况:
roots=roots.objects.选择相关('causive\u risk\u risk\u title')。筛选(effected\u risk=id)
我忘了查询模型的直接属性。我使用此模板获得了所需的内容:
{% for root in roots %}
{{ root.causal_risk.risk_title }}
{% endfor %}
请修复查看\u风险中的缩进
。还有,这个函数到底返回什么?完成。这是Django应用程序更新的基于函数的视图,谢谢,但主要问题是模板本身。@JonHrovat如果没有return
语句,甚至不会调用模板。谢谢,我已经更新了原始帖子。我忘了把那个部分复制过来,但我把它放在了我的原始代码中。嘿,谢谢你提供的关于选择相关的信息,非常感谢!