Question

I'm writing my first django app and can't seem to pass "row-level" data to the template through ListView. Specifically I'm trying to show all Polls and their corresponding Vote information using a PollListView.

Currently I am only able to pass all votes to the template, but would like to pass only the votes that belong to the specific poll.

models.py

class Poll(models.Model):
    user = models.ForeignKey(User, unique=False, blank=False, db_index=True)
    title = models.CharField(max_length=80)

class Vote(models.Model):
    poll = models.ForeignKey(Poll, unique=False, blank=False, db_index=True)
    user = models.ForeignKey(User, unique=False, blank=True, null=True, db_index=True)
    vote = models.CharField(max_length=30, blank=False, default='unset', choices=choices)

views.py

class PollListView(ListView):
    model = Poll
    template_name = 'homepage.html'
    context_object_name="poll_list"

    def get_context_data(self, **kwargs):
        context = super(PollListView, self).get_context_data(**kwargs)
        context['vote_list'] = Vote.objects.all()
        return context

urls.py

urlpatterns = patterns('',
...
    url(r'^$', PollListView.as_view(), name="poll-list"),
}

homepage.html

{% for poll in poll_list %}
  {{ poll.title }}
  {% for vote in vote_list %} 
     {{ vote.id }} {{ vote.vote }} 
  {% endfor %}
{% endfor %}

Seems like an easy task, but I can't seem to figure out how to do this using class-based views. Should I be using mixins or extra_context? Overwrite queryset? Or should I just used function-based views to solve this.

Any help would be greatly appreciated.

Était-ce utile?

La solution

I'm not sure if it's gonna work, but you can try the following:

models.py (Vote class)

poll = models.ForeignKey(Poll, related_name="votes", unique=False, blank=False, db_index=True)

views.py

class PollListView(ListView):
    queryset = Poll.objects.all().prefetch_related('votes')

with that you can access related votes:

template

{% for poll in poll_list %}
  {{ poll.title }}
  {% for vote in poll.votes.all %} 
     {{ vote.id }} {{ vote.vote }} 
  {% endfor %}
{% endfor %}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top