如何将来自多个模型的数据添加到 HTML 模板 - Django

How to add data from multiple models to HTML template - Django

背景

我创建了一个可以添加项目的小应用程序,并将其显示在索引页面中,所有这些项目都可以通过单击项目名称单独访问其自己的“配置文件项目页面”。

在项目的简介页面中,可以看到ProjectNameResponsableNameDescription等数据。

问题

我想从不同的 table 到 projects profile page 中获取数据,直到现在我只能从项目 table 中获取数据,而不能从其他项目中获取数据,怎么可能存档那个?

views.py

def registro(request, proyecto_id):
    proyecto = Proyecto.objects.get(pk=proyecto_id)
    return render (request, "Portafolio/registro.html", {
        'proyectos': proyecto
    })

models.py

from django.db import models

# Create your models here.


class Proyecto(models.Model):
    NombreProyecto = models.CharField(max_length=64)
    ResponsableProyecto = models.CharField(max_length=64)
    EvaluadorProyecto = models.CharField(max_length=64)
    DescripcionProyecto = models.CharField(max_length=500)

class Financiamiento(models.Model):
    MontoProyecto = models.IntegerField(null=True, blank=True)
    MontoPropio = models.IntegerField(null=True, blank=True)
    MontoBanca = models.IntegerField(null=True, blank=True)
    MontoPublico = models.IntegerField(null=True, blank=True)
    proyecto = models.OneToOneField(Proyecto, on_delete=models.CASCADE, primary_key=False, null=True)

class Beneficio(models.Model):
    Rentabilidad = models.BigIntegerField(null=True, blank=True)
    proyecto = models.OneToOneField(Proyecto, on_delete=models.CASCADE, primary_key=False, null=True)


class Infraestructura(models.Model):
    Infraestructura= models.CharField(max_length= 64)
    Tiempo = models.IntegerField(null=True, blank=True)
    Costo = models.BigIntegerField(null=True, blank=True)
    proyecto = models.ForeignKey(Proyecto, on_delete=models.CASCADE, primary_key=False, null=True)


class Herramienta(models.Model):
    Herramienta= models.CharField(max_length= 64)
    Cantidad = models.IntegerField(null=True, blank=True)
    Costo = models.BigIntegerField(null=True, blank=True)
    proyecto = models.ForeignKey(Proyecto, on_delete=models.CASCADE, primary_key=False, null=True)


class Equipo(models.Model):
    Personal = models.CharField(max_length= 64)
    Cantidad = models.IntegerField(null=True, blank=True)
    Duracion = models.IntegerField(null=True, blank=True)
    Costo = models.IntegerField(null=True, blank=True)
    proyecto = models.ForeignKey(Proyecto, on_delete=models.CASCADE, primary_key=False, null=True)


class Recurso(models.Model):
    materia_prima = models.CharField(max_length= 64)
    cantidad = models.IntegerField(null=True, blank=True)
    valor_unitario = models.IntegerField(null=True, blank=True)
    proyecto = models.ForeignKey(Proyecto, on_delete=models.CASCADE, primary_key=False, null=True)

registro.html

{% extends "Portafolio/layout.html" %}


{% block content %}

<h1>Proyecto {{proyectos.NombreProyecto}}</h1>
<h2>Detalle del Proyecto</h2>

<fieldset>
    <ul>
        <li>Responsable proyecto: {{proyectos.ResponsableProyecto}}</li>
        <li>Evaluador proyecto: {{proyectos.EvaluadoProyecto}}</li>
        <li>Descripción Proyecto: {{proyectos.DescripcionProyecto}}</li>
    </ul>
<fieldset>
<hr>

<h2>1.Factibilidad Financiera</h2>
<h3>A) Financiamiento </h3>

<fieldset>
    <ul>

    </ul>
<fieldset>
<hr>

<h3>B) Beneficio </h3>
<fieldset>
    <ul>

    </ul>
    <input class= "btn btn-lg btn-danger" type="submit" value="Agregar Información">
<fieldset>

<a href="{% url 'index' %}">Volver a Inicio</a>

{% endblock %}

更新 1 我已经按照答案部分的要求进行了以下更改,但它仍然没有按预期检索数据

def registro(request, proyecto_id):
    proyecto = Proyecto.objects.get(pk=proyecto_id)

    financiamento = Financiamiento.objects.filter(proyecto = proyecto)
    beneficio = Beneficio.objects.filter(proyecto = proyecto)


    return render (request, "Portafolio/registro.html", {
        'proyectos': proyecto,
        'financiamentos':financiamento,
        'benwficios': beneficio,       

    })

registro.html(更新)

{% extends "Portafolio/layout.html" %}


{% block content %}

<h1>Proyecto {{proyectos.NombreProyecto}}</h1>
<h2>Detalle del Proyecto</h2>

<fieldset>
    <ul>
        <li>Responsable proyecto: {{proyectos.ResponsableProyecto}}</li>
        <li>Evaluador proyecto: {{proyectos.EvaluadorProyecto}}</li>
        <li>Descripción Proyecto: {{proyectos.DescripcionProyecto}}</li>
        <li>Monto: {{financiamento.MontoProyecto}}</li>
    </ul>

</fieldset>
<hr>

<h2>1.Factibilidad Financiera</h2>
<h3>A) Financiamiento </h3>

<fieldset>
    <ul>
        <li>Monto: {{financiamentos.MontoProyecto}}</li>
    </ul>
</fieldset>
<hr>

<fieldset>
    <ul>
        <li>Monto: {{benwficios.Rentabilidad}}</li>
    </ul>
</fieldset>
<hr>

<a href="{% url 'index' %}">Volver a Inicio</a>

{% endblock %}

更新 2 我可以通过 for 循环解决它,这不是最优雅的解决方案,但它完成了它的工作。如果有更好的方法,请告诉我。

示例:

<fieldset>
    <ul> 
            {% for i in financiamentos %}   
                <li>Monto: {{i.MontoProyecto}}</li>
            {% endfor %}
    </ul>
</fieldset>

您似乎已将 ForeignKey 和 OnetoOne 字段添加到 Proyecto 模型和所有其他模型中。

如果要渲染其他模型,可以在views函数中使用filter by proyecto。

def registro(request, proyecto_id):
    proyecto = Proyecto.objects.get(pk=proyecto_id)

    ##### HERE ADD MODELS LOGIC################
    financiamento = Financiamento.objects.filter(proyecto = proyecto)
    benwficio = Beneficio.objects.filter(proyecto = proyecto)

    ... and so on do this with all the remaining models


   ################################################################

    return render (request, "Portafolio/registro.html", {
        'proyectos': proyecto,
        'financiamento':financiamento,
        ... so on...
    })

并将上下文添加到 html 模板。