Django цикл по списку из представления в HTML-шаблон - PullRequest
0 голосов
/ 04 октября 2018

Я спрашиваю, как я могу получить for loop в моем представлении на основе классов django для моего шаблона HTML.

Пользователь может установить один или несколько флажков, и я хотел бы отобразить информациюдля каждого установленного флажка.

На мой взгляд, у меня есть:

checkbox_list = self.request.GET.getlist('PUBSDChoice') #Get object id checked by user
context_data['checkbox_list'] = checkbox_list

for checkbox in checkbox_list:
    pubsd = Publication.objects.get(id=checkbox)  
    get_request = Download.objects.filter(pub__publication__id=pubsd.id).count()

    context_data['pubsd'] = pubsd
    context_data['get_request'] = get_request

Теперь в моем шаблоне у меня есть:

<table>
    <tbody>
    <tr>
        <th>{% trans 'Publication ID' %}</th>
        <th>{% trans 'Requests' %}</th>
    </tr>
    {% for item in checkbox_list %} # I'm not sure for this loop
    <tr>
        <td>{{ pubsd.pub_id }}</td> #Do I have to add item.??
        <td>{{ get_request }}</td>
    </tr>
    {% endfor %}
    </tbody>
</table>

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

РЕДАКТИРОВАТЬ:

Это мой реальный код со всеми наборами запросов в моем представлении:

checkbox_list = self.request.GET.getlist('PUBSDChoice')
context_data['checkbox_list'] = checkbox_list

for checkbox in checkbox_list:
    pubsd = Publication.objects.get(id=checkbox)  # display publication id

    # Count number of requests in download table for checked publication
    get_request = Download.objects.filter(pub__publication__id=pubsd.id).count()
    #Get sum of publication usage (= downloads) for checked publication
    get_download = Download.objects.filter(pub__publication__id=pubsd.id).aggregate(get_sum_usage=Sum('usage'))

    # Get country which maximum download the checked publication
    get_country = Country.objects.filter(download__pub__publication__id=pubsd.id).annotate(
                ndown=Count('download')).order_by('-ndown').first()
    # Get customer which maximum download the checked publication
    get_customer = Download.objects.filter(pub__publication__id=pubsd.id).values('email').order_by(
                'email').annotate(count_email=Count('email')).first()
    # Get the best downloaded format for the checked publication
    get_format = Download.objects.filter(pub__publication__id=pubsd.id).values('pub__format').annotate(
                format_count=Count('pub__format')).order_by('-format_count').first()

    context_data['pubsd'] = pubsd
    context_data['get_request'] = get_request
    context_data['get_download'] = get_download
    context_data['get_country'] = get_country
    context_data['get_customer'] = get_customer['email']
    context_data['get_format'] = get_format['pub__format']

И это именно моя модель:

class Publication(models.Model):
    pub_id = models.CharField(max_length=10, verbose_name=_('publication ID'), default='')
    title = models.CharField(max_length=512, verbose_name=_('publication title'), null=False, unique=True)
    category = models.ForeignKey(Category, verbose_name=_('category'), null=False, related_name='publication')
    nb_document = models.IntegerField(verbose_name=_('number of documents'), default=0)
    nb_download = models.IntegerField(verbose_name=_('number of downloads'), default=0)
    new_publication = models.BooleanField(verbose_name=_('new publication'), default=True)

class Document(models.Model):
    language = models.CharField(max_length=2, verbose_name=_('language'), choices=LANGUAGE_CHOICES, null=False)
    format = models.CharField(max_length=10, verbose_name=_('format'), choices=FORMAT_CHOICES, null=False)
    title = models.CharField(max_length=512, verbose_name=_('document title'), null=False)
    publication = models.ForeignKey(Publication, verbose_name=_('publication title'), null=False,
                                    related_name='documents')
    nb_download = models.IntegerField(verbose_name=_('number of downloads'), default=0)

class Download(models.Model):
    email = models.CharField(max_length=150, verbose_name=_('e-mail'), null=False)
    country = models.ForeignKey(Country, verbose_name=_('country'), related_name='download')
    pub = models.ForeignKey(Document, verbose_name=_('Publication ID'), null=False)
    usage = models.IntegerField(verbose_name=_('usage'), default=0)

class Customer(models.Model):
    email = models.CharField(max_length=150, verbose_name=_('e-mail'), null=False)
    country = models.ForeignKey(Country, verbose_name=_('country'))
    institution = models.CharField(max_length=255, verbose_name=_('institution'), null=True)

Как я уже говорил ранее, для одной проверенной публикации она работает нормально, но когда я хочу проверить несколько публикаций, она не работает.

Если кто-то может помочь мне преобразовать это, это будетсупер!Иначе я постараюсь использовать хороший ответ, сделанный ранее, чтобы сделать это:)

1 Ответ

0 голосов
/ 04 октября 2018

Здесь вы каждый раз перезаписываете предыдущее значение ключа.В результате в окончательном context_data содержатся только значения, извлеченные в итерации last .

checkbox_list = self.request.GET.getlist('PUBSDChoice')
context_data['checkbox_list'] = checkbox_list

context_data['pubsd'] = Publication.objects.filter(
    <b>id__in=checkbox_list</b>
).annotate(
    ndown=Count('publication__download')  # or something related
)

Таким образом, мы фильтруем набор запросов так, чтобы он содержал только Publication s с помощью id в списке, и мы аннотируем количество загрузок (возможно, выражение немного отличается, так как вы не включили models.py).

Выше не будет сортировать по checkbox_list.Если это требование, вы можете выполнить его сортировку.

В шаблоне вы можете отобразить это следующим образом:

{% for item in pubsd %}
<tr>
    <td>{{ item.pub_id }}</td>
    <td>{{ item.ndown }}</td>
</tr>
{% endfor %}

Таким образом, мы выполняем итерацию по pubsd queryset идля каждого item (это Publication объект) мы визуализируем item.pub_id и item.ndown.

...