Django的。干。获取请求中的相同上下文

时间:2018-09-28 19:01:31

标签: python django

我正在尝试使用Django开发投票应用程序。 在此处显示投票的视图。

class DetailVoteView(View):
    """
    Displays the vote
    If vote is active allows to vote
    If vote is completed shows winners and top 5
    """
    vote = None
    vote_for_chars = None
    page_title = ''

    def dispatch(self, request, *args, **kwargs):
        self.vote = Vote.objects.get(id=kwargs['id'])
        self.vote_for_chars = self.vote.voteforcharacter_set.all()
        self.page_title = self.vote.title
        return super(DetailVoteView, self).dispatch(request, *args, **kwargs)

    def get(self, request, id):

        if is_active_vote(self.vote):
            nominates = self.vote_for_chars
            return render(request, 'vote_detail/active_vote_detail.html', context={
                'page_title': self.page_title,

                'vote': self.vote,
                'votes_name': self.page_title,

                'nominates': nominates,
            })
        else:
            winners = []
            top_fives = []
            if self.vote.voteforcharacter_set.count() != 0:
                sorted = self.vote.voteforcharacter_set.order_by('-votes_number')
                winner_number_votes = sorted[0].votes_number
                winners = self.vote_for_chars.filter(votes_number__exact=winner_number_votes)
                top_fives = sorted[winners.count():5 + winners.count()]
            return render(request, 'vote_detail/completed_vote_detail.html', context={
                    'page_title': self.page_title,

                    'vote': self.vote,
                    'votes_name': self.page_title,

                    'winners': winners,
                    'top_fives': top_fives
                })

    def post(self, request, id):
        vote_for_chars = self.vote_for_chars
        id_to_vote = request.POST.get("id_to_vote")
        char_to_vote = vote_for_chars.get(character__id=id_to_vote)
        char_to_vote.votes_number += 1
        char_to_vote.save()
        return HttpResponseRedirect('/')

代码不是我想的那样干。因为,在reuqest中存在相同的上下文。 我需要使用mixins功能吗? 我该如何改善?谢谢。

已编辑。

添加了模板代码。

acvtive_vite_detail.html

{% extends 'base/base.html' %}

{% block content %}
 <form action="." method="POST">{% csrf_token %}
    <p>Vote: {{ vote }}.</p>
    <p>Choose:</p>
  <div>
    {% for item in nominates %}
        {% include "base/listOutput.html" %}
        <input type="radio" id="{{ item.id }}"
               name="id_to_vote" value="{{ item.character.id }}" checked>
        <label for="{{ item.character.name }}">{{ item.character.name }} 
        </label>
    {% endfor %}
   </div>
   <div>
     <button type="submit">Vote!</button>
   </div>
  </form>
{% endblock content %}

completed_vote_detail.html

{% extends 'base/base.html' %}

{% block content %}
<p>Vote: {{ vote }}.</p>
<p>Winners: </p>
    {% for item in winners %}
        <p>{% include "base/listOutput.html" %}</p>
    {% endfor %}

<p>Top5: </p>
    {% for item in topFives %}
        <p>{% include "base/listOutput.html" %}</p>
    {% endfor %}
{% endblock content %}

listOfOutput.html

<div style="border-style: solid; width: 25%">
    <img src="{{ item.character.image.url }}" alt="img" class="img-responsive img-rounded" width="100%" height=auto>
    <p>Name: {{ item.character.name }}</p>
    <p>Age: {{ item.character.age }}</p>
    <p>Votes number: {{ item.votes_number }}</p>
</div>

0 个答案:

没有答案