Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django ManyToManyField引用自:渲染到模板_Python_Django_Django Models_Django Templates_Django Views - Fatal编程技术网

Python Django ManyToManyField引用自:渲染到模板

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

下面是我正在从事的一个项目的代码。正如您在视图中看到的,我正在运行风险模型中与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 %}
模板:

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
语句,甚至不会调用模板。谢谢,我已经更新了原始帖子。我忘了把那个部分复制过来,但我把它放在了我的原始代码中。嘿,谢谢你提供的关于选择相关的信息,非常感谢!