Python django视图中的父子总和并传递给模板
我是Django的新手,我有一个简单的项目,有一个项目的父模型和子模型以及相关的项目任务。一个项目将有多个项目任务。 我希望能够通过模板显示项目和项目任务总和Python django视图中的父子总和并传递给模板,python,django,Python,Django,我是Django的新手,我有一个简单的项目,有一个项目的父模型和子模型以及相关的项目任务。一个项目将有多个项目任务。 我希望能够通过模板显示项目和项目任务总和 class Project(models.Model): projectContact = models.ForeignKey(Contact) projectTitle = models.CharField(max_length=100) projectAddress1 = models.CharField(ma
class Project(models.Model):
projectContact = models.ForeignKey(Contact)
projectTitle = models.CharField(max_length=100)
projectAddress1 = models.CharField(max_length=200)
projectValueProposed = models.IntegerField(default=0)
projectValueActual = models.IntegerField(default=0)
def __str__(self):
return self.projectTitle
class ProjectTask(models.Model):
projectName = models.ForeignKey(Project)
projectTaskDesc = models.CharField(max_length=200)
projectTaskContact = models.ForeignKey(Contact)
projectTaskAmount = models.IntegerField(default=0)
def __str__(self):
return self.projectTaskDesc
我的看法如下
def index(request):
project_list = Project.objects.all()
project_task = ProjectTask.objects.all()
##project_task = ProjectTask.objects.all() ##filter(projectName=2).aggregate(amount=Sum('projectTaskAmount'))
for pid in project_list:
ptask = project_task.filter(projectName=pid.id)
context = {'project_list':project_list,'project_task':ptask}
return render(request,'construction/index.html',context)
模板是
{% if project_list %}
<table class="tg">
<tr>
<th class="tg-le8v">Project name</th>
<th class="tg-le8v">Customer</th>
<th class="tg-le8v">Proposed Value</th>
<th class="tg-le8v">Actual Value</th>
</tr>
{% for projects in project_list %}
<tr>
<td class="tg-yw4l"><a href="{% url 'construction:projectview' projects.id%}">{{ projects.projectTitle }}</a></td>
<td class="tg-yw4l">{{ projects.projectContact }}</td>
<td class="tg-yw4l">{{ projects.projectValueProposed }}xx{{projects.id }}</td>
<td class="tg-yw4l">{{ project_task}}</td>
</tr>
{% endfor %}
</table>
{% else %}
<p>No projects are available.</p>
{% endif %}
{%if项目\列表%}
项目名称
顾客
建议值
实际价值
{项目列表%中的项目为%0}
{{projects.projectContact}
{{projects.projectValueProposed}}xx{{{projects.id}
{{project_task}}
{%endfor%}
{%else%}
没有可用的项目
{%endif%}
我使用管理员创建项目和添加项目任务,这很好。
我有两个选择:
1.在保存管理页面时更新项目中projectValueActual的值
2.动态显示项目和相关项目TaskAmount之和的步骤
需要一些关于如何在视图中准备值(如果这是正确的位置)并以某种方式传递上下文的帮助,我可以显示它。可以使模型属性的名称不那么冗长。另外,将相关的_名称添加到ForeignKey,以便可以直接从项目模型中引用它
class Project(models.Model):
contact = models.ForeignKey(Contact)
title = models.CharField(max_length=100)
address1 = models.CharField(max_length=200)
valueProposed = models.IntegerField(default=0)
valueActual = models.IntegerField(default=0)
def __str__(self):
return self.title
class ProjectTask(models.Model):
project = models.ForeignKey(Project, related_name='tasks')
description = models.CharField(max_length=200)
contact = models.ForeignKey(Contact)
amount = models.IntegerField(default=0)
def __str__(self):
return self.description
这使得观点更简单
def index(request):
ctx = {'project_list': Project.objects.all()}
return render(request, 'construction/index.html', ctx)
我不太确定您想在模板中做什么,但假设您想列出每个相关项目下的所有任务,然后打印ProjectTask.amount
值的总和
{% if project_list %}
<table class="tg">
<tr>
<th class="tg-le8v">Project name</th>
<th class="tg-le8v">Customer</th>
<th class="tg-le8v">Proposed Value</th>
<th class="tg-le8v">Actual Value</th>
</tr>
{% for project in project_list %}
<tr>
<td class="tg-yw4l"><a href="{% url 'construction:projectview' projects.id%}">{{ project.title }}</a></td>
<td class="tg-yw4l">{{ project.contact }}</td>
<td class="tg-yw4l">{{ project.valueProposed }}xx{{projects.id }}</td>
<td class="tg-yw4l">
{% for task in project.tasks %}
<span>{{ task.amount }}</span>
{% if forloop.last %} = {% else %} + {% endif %}
{% endfor %}
{{ project.sumTaskAmounts }}
</td>
</tr>
{% endfor %}
</table>
{% else %}
<p>No projects are available.</p>
{% endif %}
没有测试任何一个,但这或多或少应该可以做到。我做了以下更改,以在保存管理表单时实现更新 models.py
def update_total_amount(self):
total=0
total=self.task.aggregate(amount=Sum('amount'))
self.valueActual=total['amount']
self.save()
在admin.py中
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
instance.save()
formset.save_m2m()
instance.project.update_total_amount()
为我想做的事工作。谢谢您的帮助。完美的解决方案。我所做的唯一更改是删除模型中的.amount(抛出错误)并在模板中使用.amount。现在想知道如何在保存管理表单时更新Project.valueActual中的值
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
instance.save()
formset.save_m2m()
instance.project.update_total_amount()