2014-09-29 21 views
1

搜索了很長時間後沒有得到答案,我要在這裏嘗試。僅顯示對象一次並計算它

我正在Django上工作。我的項目是一個管理系統,每次收件人打開郵件時,我知道打開郵件的人以及打開郵件的時間。 這裏是我顯示統計信息的表格。它向我展示了每個收件人和日期時間,但是我的問題是我想要看到每個收件人一次,然後顯示它打開了多少次。

 <tbody> 
      {% for stat_mail in stat_mail %} 
      {% ifchanged stat_mail.recipient %} 
       <tr> 
        <td>{{ stat_mail.recipient }}</td> 
        <td>{{ stat_mail.datetime }}</td> 
        <td>{{ stat_mail.recipient_set.all|length }}</td> 
       </tr> 
      {% endifchanged %} 
      {% endfor %} 
     </tbody> 

例如: 試驗1在下午5點和下午8點打開郵件,所以表應該顯示

試驗1/5PM,8PM/2

收件人的名稱,操作日期和操作次數。

對不起,我的英文不好,但我是法國人:)

希望有人能幫助我,如果u有其他問題或需要更多的代碼只問。

非常感謝!

編輯:我的models.py

class Recipient(models.Model): 
name = models.CharField(max_length=255, verbose_name= ('Nom'), null=True, blank=True) 
first_name = models.CharField(max_length=255, verbose_name= ('Prénom'), null=True, blank=True) 
mail = models.EmailField(verbose_name= ('Adresse du destinataire')) 
def __unicode__(self): 
    return u'%s %s' % (self.name, self.first_name) 

class Tag(models.Model): 
name = models.CharField(max_length=255, blank=False) 
recipients = models.ManyToManyField(Recipient, verbose_name='Destinataires', null=False, blank=False, related_name="tags") 
def __unicode__(self): 
    return self.name 

class Mail(models.Model): 
subject = models.CharField(max_length=255, verbose_name= ('Sujet'), blank=False, null=False) 
content = HTMLField(verbose_name= ('Contenu'), blank=False, null=False, default=' ') 
tags = models.ManyToManyField(Tag, verbose_name= ('Destinataires'), null=True, blank=True, related_name='mails') 
recipients = models.ManyToManyField(Recipient, verbose_name='Destinataires', null=True, blank=True, related_name='mails') 
date_create = models.DateTimeField(verbose_name= ('Date de création'), default=datetime.now, blank=False, editable = False) 
writer = models.ForeignKey(Intervenant, verbose_name= ('Personne écrivant la compagne'), null=True, blank=True) 
holding = models.ForeignKey(Holding, verbose_name= ('Organisation'),related_name= ('Questionnaire_mail'), null=False, blank=False, default=1, editable = False) 
sended = models.BooleanField(verbose_name = ('Compagne envoyée ?'), default=False, editable=False) 
opened = models.IntegerField(verbose_name=("Nombre totale d'ouverture"), default=0, editable=False) 
email = models.EmailField(verbose_name='Destinataire de Test', blank=True, null=True) 

date_create = models.DateTimeField(verbose_name= ('Date de création'), default=datetime.now, blank=False, editable = False) 
date_sent = models.DateTimeField(verbose_name= ('Date de création'), blank=True, null=True, editable = False) 

def __unicode__(self): 
    return self.subject 

class Mail_Stats(models.Model): 
mail = models.ForeignKey(Mail, verbose_name= ('Compagne'), related_name='mails_stats') 
recipient = models.ForeignKey(Recipient, verbose_name= ('Destinataires'), null=True, blank=True, related_name='mails_stats') 
datetime = models.DateTimeField(verbose_name= ('Date et Heure'), auto_now_add=True) 
+0

那麼,你看到的是什麼,而不是你所期待的?這將有助於展示模型。 – 2014-09-29 07:57:06

+0

該表應顯示不同的收件人(不重複的人) 並計算一個收件人打開郵件的次數 我在問題上添加了我的模型 實際上,每次收件人顯示在收件人表中時它都會顯示不算數。 – Eowiena 2014-09-29 08:09:54

回答

0

你應該在視圖準備數據,然後將它傳遞給模板。像這樣(未經):

from django.shortcuts import render 

from .models import Mail_Stats 

def stats_view(request): 
    recipient_list = [] # this will be put in the template context 

    current_recipient = None 
    cnt_read = 0 
    read_datetime_list = [] 

    for stat in Mail_Stats.objects.all().order_by('mail', 'recipient'): 
     if stat.recipient != current_recipient: 
      if cnt_read > 0: 
       recipient_list.append({ 
        'recipient': current_recipient, 
        'read_datetime_list': read_datetime_list, 
        'cnt_read': cnt_read 
       }) 
      current_recipient = stat.recipient 
      cnt_read = 0 
      read_datetime_list = [] 
     cnt_read += 1 
     read_datetime_list.append(stat.datetime) 

    # add last recipient to the list, if not None 
    if current_recipient is not None: 
     recipient_list.append({ 
      'recipient': current_recipient, 
      'read_datetime_list': read_datetime_list, 
      'cnt_read': cnt_read 
     }) 

    render(request, 'mail_stats.html', { 'recipient_list': recipient_list }) 

然後在你的模板,你可以簡單地做這樣的事情:

<tbody> 
    {% for r in recipient_list %} 
     <tr> 
      <td>{{ r.recipient }}</td> 
      <td> 
       <ul> 
       {% for dt in r.read_datetime_list %} 
        <li>{{ dt }}</li> 
       {% endfor %} 
       </ul> 
      </td> 
      <td>{{ r.cnt_read }}</td> 
     </tr> 
    {% endfor %} 
</tbody> 

最重要的是:不要糾纏在模板中做複雜的東西,只有讓他們用於演示目的。移動視圖中的所有邏輯(或模型或實用程序模塊),即可充分利用Python的所有功能。

+0

更好的數據結構可以是字典;關鍵是收件人。 – 2014-09-29 08:50:54

+0

它的工作表示感謝,唯一的問題是表中的最後一個收件人不會進入列表,因此不會顯示在表格中。 因爲它永遠不會進入: 如果stat.recipient!= current_recipient: 如果有人有一個想法如何解決它? 但真的非常感謝它幫助了我很多! – Eowiena 2014-09-29 09:40:56

+0

編輯:我改變了代碼,只是把.append放在最後,所以每次列表得到一個新的條目,然後在模板上我只是使用ifchanged。但我認爲存在更好的解決方案 – Eowiena 2014-09-29 09:48:52