2016-04-05 21 views
0

Django'da yeniyim ve aşağıdakileri yapmak istiyorum. Basit bir projem var ve bir Projenin ana ve çocuk modeline ve ilgili Proje Görevlerine sahibim. Bir projede birden fazla ProjectTask olacak. Proje ve ProjectTask toplamını şablon aracılığıyla görüntüleyebilmek istiyorum.django ebeveyn çocuk toplamı görünümünde ve şablona geçiş

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 

Görünümüm aşağıdaki gibidir.

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) 

ve şablon

ben Projesi oluşturmak ve iyi çalışıyor projectTask eklemek için Yönetici kullanıyorum

{% 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 %} 

olduğunu. i 2. değerlerini hazırlamak için bazı yardıma mı ihtiyacınız ilgili ProjectTaskAmount

dinamik Projesi ve toplamını görüntülemek için Yönetici sayfasını kaydettiğinizde 1. Projesi projectValueActual değerini güncellemek için: İki seçenek var görünümünde (bunu yapmak için doğru yer ise) ve içeriği bir şekilde iletebilirim.

cevap

0

Model özelliklerinin adları çok daha az ayrıntılı hale getirilebilir. Ayrıca, ForeignKey'e bir ilgili_adı ekleyerek, bunu doğrudan Proje modelinden de kullanabilirsiniz. görünümü yapar

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 

çok daha basit

def index(request): 
    ctx = {'project_list': Project.objects.all()} 
    return render(request, 'construction/index.html', ctx) 

Ben şablonunuzda yapmak istiyorum, ancak her ilgili Projeleri ve ardından baskı altındaki tüm Görevler listelemek istediğiniz varsayalım sağlar oldukça emin değildi ProjectTask.amount değerlerinin toplamı.

{% 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 %} 

Ve son olarak, kolayca tüm Task.amount özelliklerinin toplamını almak için, bir @property her projenin ProjectTask örnekleri için amount değerlerin toplamını döndürür Project eklemek gerekir.

class Project(models.Model): 
    ... 

    @property 
    def sumTaskAmounts(self): 
     return self.tasks.aggregate(amount=Sum('amount')).amount 

Bunlardan hiçbirini test etmediniz, ancak bu az çok yapmalı.

+0

Mükemmel bir çözüm. Ben sadece değiştirdim .amount modellerinde kaldırmak (bir hata atıyordu) ve şablonda .amount kullanın. Yönetici formunu kaydettiğimde Project.valueActual'daki değeri nasıl güncelleyebileceğimi merak ediyorum. 'Code' –

0

Yönetici formunu kaydettiğimde güncelleştirmeyi uygulamak için aşağıdaki değişiklikleri yaptım.

def update_total_amount(self): 
     total=0 
     total=self.task.aggregate(amount=Sum('amount')) 
     self.valueActual=total['amount'] 
     self.save() 

ve ben ne yapmak istediğini için 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() 

eserlerinde models.py

. yardım için teşekkürler.

İlgili konular