KochetovMXM
KochetovMXM

Reputation: 59

How to display queryset list?

I am creating website for game tournaments. I have specialized queryset. I want to display on one page teams' names and their players.

I tried to work with "get_queryset()" function but I don't understand what exactly. Probably there is mistake in template section.

models.py

from django.db import models

class TestTeam(models.Model):
    name = models.CharField(max_length=30, default='Team')
    slug = models.SlugField(max_length=5)

    def __str__(self):
        return self.name


class TestPlayer(models.Model):
    name = models.CharField(max_length=100, default='Player')
    nick = models.CharField(max_length=20, default='Nickname')
    team = models.ForeignKey(TestTeam, on_delete=models.DO_NOTHING, default='Team')
    #photo = models.ImageField(upload_to='', null=True)
    No = 'N'
    Yes = 'Y'
    STANDIN_CHOICES = [
        (Yes, 'Yes'),
        (No, 'No'),
    ]
    standin = models.CharField(max_length=5, choices=STANDIN_CHOICES, default=No)
    slug = models.SlugField(max_length=20, default=nick)

    def __str__(self):
        return self.name


class TestMatch(models.Model):
    name = models.CharField(max_length=100, default='Match')
    leftTeam = models.ForeignKey(TestTeam, on_delete=models.DO_NOTHING, related_name='+', default='Left Team')
    rightTeam = models.ForeignKey(TestTeam, on_delete=models.DO_NOTHING, related_name='+', default='Right Team')
    slug = models.SlugField(default=str(name))

    def __str__(self):
        return (str(self.leftTeam) +" - "+ str(self.rightTeam))

urls.py

from . import views
from django.urls import path

urlpatterns = [
    path('', views.TestView.as_view(), name='home'),
    path('<slug:slug>/', views.MatchView.as_view(), name='match'),
]

views.py

from django.views.generic import ListView, DetailView
from . import models
from django.shortcuts import get_list_or_404

class TestView(ListView):
    model = models.TestMatch
    template_name = 'home.html'

class MatchView(DetailView):
    model = models.TestPlayer
    template_name = 'match.html'

    def get_queryset(self):
        queryset = super().get_queryset()
        if 'slug' in self.kwargs:
            team_slug = self.kwargs['slug']
            TEAM = get_list_or_404(models.TestTeam, slug=team_slug)
            queryset = queryset.filter(team=TEAM[0])
        return queryset

HTML for displaying(match.html)

{% extends 'base.html' %}
{% block content %}

{% regroup  object_list by team as player_list %}
    {% for player in player_list %}
        <h3>{{ player.name }}</h3>
    {% endfor %}
{% endblock %}

I want Teams and their players to be displayed on one page.

Upvotes: 1

Views: 52

Answers (2)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476594

The {% regroup .. %} tag [Django-doc] means that player_list contains not a list of players: it contains groups of teams, and in each group there is a list of players.

You thus render this as:

{% regroup object_list by team as team_list %}
{% for team in team_list %}
    <h3>{{ team.grouper }}</h4>
    {% for player in team.list %}
        <h4>{{ player }}</h4>
    {% endfor %}
{% endfor %}

Here the grouper is thus a reference to the Team, and the team.list will then contain an iterable of related Players.

Upvotes: 1

ruhaib
ruhaib

Reputation: 649

instead of this:

TEAM = get_list_or_404(models.TestTeam, slug=team_slug)
queryset = queryset.filter(team=TEAM[0])

try this:

queryset = queryset.filter(team__slug=team_slug)

Upvotes: 0

Related Questions