Шаблон Django не отображается правильно - PullRequest
0 голосов
/ 08 июля 2011

Я вернулся в Django после того, как покинул его несколько месяцев назад, и вернулся к тому приложению для опросов, которое я сделал из этого урока. Я добавил общее количество голосов и процент. Процент, например, отображает, какой процент от общего числа голосов имеет конкретный выбор опроса. Нет ошибок, нет ничего. Это просто не показывает вообще. Я имею в виду, все показывает, кроме процента. Как будто я никогда не писал это в шаблоне!

results.html:

<h1>{{ poll.question }}</h1>

<ul>
{% for choice in poll.choice_set.all %}
    <li>{{ choice.choice }} - {{ choice.percentage }} ({{ choice.votes }}) </li>
{% endfor %}
</ul><br /><br />
<p>Total votes for this poll: {{ total }} </p>

views.py:

def results(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    choices = list(p.choice_set.all())
    total_votes = sum(c.votes for c in choices)
    percentage = {}

    for choice in choices:
        vote = choice.votes
        vote_percentage = int(vote*100.0/total_votes)
        choice.percentage = vote_percentage

    return render_to_response('polls/results.html', {'poll': p, 'total': total_votes}, context_instance=RequestContext(request))

Помощь? : P

спасибо

EDIT:

Я попробовал решение Игнасио, но до сих пор не пошел.

Ответы [ 3 ]

2 голосов
/ 08 июля 2011

Вы не можете индексировать словари для такой переменной в шаблонах. Я рекомендую сделать это по-другому:

for choice in choices:
   ...
  choice.percentage = vote_percentage

...

{% for choice in poll.choice_set.all %}
    <li>{{ choice.choice }} - {{ choice.percentage }} ({{ choice.votes }}) </li>
{% endfor %}
1 голос
/ 08 июля 2011

Вы запрашиваете выбор дважды. Один раз в представлении choices = list(p.choice_set.all()) и снова в шаблоне {% for choice in poll.choice_set.all %}. Это означает, что ваш расчет никогда не будет использован. Если вы хотите рассчитать процент в представлении и получить доступ к нему в шаблоне, вам нужно передать его в контексте:

def results(request, poll_id):
    ...
    return render_to_response('polls/results.html', {'poll': p, 'total': total_votes, 'choices': choices}, context_instance=RequestContext(request))

, а затем получить доступ к нему в шаблоне:

{% for choice in choices %}
    <li>{{ choice.choice }} - {{ choice.percentage }} ({{ choice.votes }}) </li>
{% endfor %}
0 голосов
/ 02 июля 2012

Быстрый и грязный ответ:

# views.py
def results(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    # XXX code smell: one shouldn't have to turn a queryset into a list
    choices = list(p.choice_set.all())

    # XXX code smell: this would be better using aggregation functions
    total_votes = sum(c.votes for c in choices)

    # XXX code smell: and this too   
    for choice in choices:
       vote = choice.votes
       vote_percentage = int(vote*100.0/total_votes)
       choice.percentage = vote_percentage

  context = {
      'poll': p, 
      'total': total_votes, 
      'choices'  :choices
      }
  return render_to_response(
      'polls/results.html',
      context,
      context_instance=RequestContext(request)
      )

и в шаблоне:

 {% for choice in choices %}
    <li>{{ choice.choice }} - {{ choice.percentage }} ({{ choice.votes }}) </li>
 {% endfor %}

но это плохо использует orm и лежащие в его основе дб - лучше использовать аннотации и функции агрегирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...