Python 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

我是Django的新手,我有一个简单的项目,有一个项目的父模型和子模型以及相关的项目任务。一个项目将有多个项目任务。 我希望能够通过模板显示项目和项目任务总和

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()