2011-07-07 7 views
0

数ヶ月前にDjangoに戻ってきて、チュートリアルで作成した投票用アプリケーションに戻ってきました。総投票数とパーセンテージを追加しました。パーセンテージは、と同様に、特定の投票選択の投票総数の何パーセントを表示します。エラーも何もない。それはまったく表示されません。つまり、パーセンテージ以外はすべてが表示されます。私がテンプレートに書いたことのないように!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:

私はイグナシオのソリューションとはまだありません行くを試してみました。

答えて

1

...

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

:私はそれを他の方法をやってお勧めします。一度ビュー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

ありがとう、それはトリックでした!しかし、なぜ2回クエリを実行したのですか?値がchoice.percentageに保存されていませんでしたか? – Lockhead

+0

パーセンテージはモデルフィールドではないので、選択モデルインスタンスでも 'save'を呼び出すビューには何も表示されません。 –

2

テンプレートのような変数に辞書をインデックス登録することはできません。あなたが二回の選択肢を照会している

{% for choice in poll.choice_set.all %} 
    <li>{{ choice.choice }} - {{ choice.percentage }} ({{ choice.votes }}) </li> 
{% endfor %} 
+0

モデルに選択率を追加することを意味しますか?私はそれを試みるかもしれないが、将来の参照のために、どのように私は現在のコードを修正するのですか? – Lockhead

+0

現在のコードを修正することはできません。そして、モデルに '%'を追加する必要はありません。 –

+0

これはちょっと混乱します... Djangoはどのような選択肢が分かりますか?パーセンテージはどうですか?私はそれがテンプレートで動作すると思っていました。なぜなら、あなたはどこかで辞書にアクセスすることができますが、それはviews.pyでどのように動作するのでしょうか? – Lockhead

0

クイック&汚い答え:

# 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と基盤となるdbをうまく利用していません - アノテーションと集計関数を使う方が良いでしょう。

関連する問題