2014-09-29 4 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> 

Например: Test 1 открыл почту на 5PM и в 8 вечера, так что таблица должна отображать

Тест 1/5PM, 8PM/2

Имя получателя, дата отталкивания и число оппонирования.

Извините за плохой английский, но я французский :)

Надежда кто-то может мне помочь, если у вас другой вопрос или нужно больше кода просто спросить.

Большое спасибо!

EDIT: Мой 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

Итак, что вы видите вместо того, что вы ожидали? И это поможет показать модели. –

+0

В таблице должны быть указаны адреса получателей (те, которые не повторяются) И подсчитайте, сколько раз один получатель открыл почту Я добавил свои модели по вопросу Фактически он показывает получателя каждый раз, когда они находятся в таблице, и это не в счет. – Eowiena

ответ

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

Лучшей структурой данных будет словарь; при этом ключ является получателем. –

+0

Это работает спасибо, единственное, что последний получатель в таблице не попадает в список, поэтому не отображается на столе. Потому что он никогда не заходит в: , если stat.recipient! = Current_recipient: Если у кого-то есть идея, как его исправить? Но действительно спасибо, это мне очень помогло! – Eowiena

+0

EDIT: я изменил код и просто положил .append в конце, поэтому каждый раз, когда список получает новую запись, а затем на шаблоне я просто использовал ifchanged. Но я думаю, что существует лучшее решение. – Eowiena

Смежные вопросы