Reputation: 59
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
Reputation: 476594
The {% regroup .. %}
tag [Django-doc] means that player_list
contains not a list of player
s: 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 Player
s.
Upvotes: 1
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