如何将来自多个模型的数据添加到 HTML 模板 - Django
How to add data from multiple models to HTML template - Django
背景
我创建了一个可以添加项目的小应用程序,并将其显示在索引页面中,所有这些项目都可以通过单击项目名称单独访问其自己的“配置文件项目页面”。
在项目的简介页面中,可以看到ProjectName
、ResponsableName
、Description
等数据。
问题
我想从不同的 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 模板。
背景
我创建了一个可以添加项目的小应用程序,并将其显示在索引页面中,所有这些项目都可以通过单击项目名称单独访问其自己的“配置文件项目页面”。
在项目的简介页面中,可以看到ProjectName
、ResponsableName
、Description
等数据。
问题
我想从不同的 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 模板。