gpt4 book ai didi

python - Django ManyToManyField 引用自身 : Rendering to template

转载 作者:行者123 更新时间:2023-12-01 01:31:49 26 4
gpt4 key购买 nike

下面是我正在开发的一个项目的代码。正如您在 View 中看到的,我正在对风险模型中与 Url 中的主键关联的对象运行查询。

问题是我无法访问正在查询的对象的属性。

型号

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 %}

运行上面的代码会返回:

Roots object (2) Roots object (3)

这应该是预料之中的,因为这些是我通过管理界面对模型所做的条目。

但是,当我运行时:

{% for root in roots %}

{{ root.risk_title }}

{% endfor %}

屏幕留白。

TLDR将查询从中间表传递到模板可以工作,但模板无法访问对象属性。如何运行上述查询然后访问模板中的对象?

已更新根据 JoJo 的响应包含渲染部分。这个问题已根据我的其他更新得到解决。

提前谢谢您!

最佳答案

请注意, View 函数缺少 return 语句,因此实际上根本没有渲染 html 页面。

假设模板 html 名为 'my_template.html',缺少的 return 应该类似于:

def view_risk(request, id):
# ...
return render(request, 'my_template.html', args)

此外,正如@JonHrovat提到的,模板需要调用

{{ root.causal_risk.risk_title }}

在for循环中。

关于效率的说明:

如果您使用当前对 roots 的查询在模板中调用 root.causal_risk.risk_title,这会导致额外的查询,每次迭代一个。这可以通过使用 select-related 来避免。在 View 函数中查询根时的语句:

roots = Roots.objects.select_related('causal_risk__risk_title').filter(effected_risk=id)

关于python - Django ManyToManyField 引用自身 : Rendering to template,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52788212/

26 4 0