【问题标题】:Django ManyToManyField referencing self: Rendering to templateDjango ManyToManyField 引用自我:渲染到模板
【发布时间】:2018-10-12 23:34:52
【问题描述】:

以下是我正在处理的项目的代码。正如您在视图中看到的,我正在对与 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_risk中的缩进。另外,这个函数究竟返回了什么?
  • 完成。这是 Django 应用程序的基于函数的视图

标签: python django django-models django-templates django-views


【解决方案1】:

请注意,视图函数缺少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 循环中。

效率说明

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

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

【讨论】:

  • 已更新,谢谢,但主要问题是模板本身。
  • @JonHrovat 如果没有 return 语句,甚至不会调用模板。
  • 谢谢,我已经更新了原帖。我忘记复制那部分了,但我在我的原始代码中有它。
  • 您好,感谢您提供有关选择相关的信息,非常感谢!
【解决方案2】:

忘记查询模型的直接属性了。我用这个模板得到了我需要的东西:

{% for root in roots %}

{{ root.causal_risk.risk_title }}

{% endfor %}

【讨论】:

    猜你喜欢
    • 2022-07-22
    • 2014-04-29
    • 2018-05-20
    • 2018-11-05
    • 2016-08-23
    • 2015-10-29
    • 2012-01-22
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多