Reputation: 117
So im currently working on a private project using Django and when I try loading the page for the teams it just says "list index out of range" and im using object.all() to fetch every team from the model Team,
Inside the template im using a for loop to post each team on the page I've been trying using order_by() and first() but they didn't either seem to help.
My traceback is here http://dpaste.com/2S4Q7FY
What am I doing wrong here what should I change
def teams(request):
teams = Team.objects.all()
context = {
'teams': teams,
}
if request.user.is_authenticated():
logged_in_user = get_object_or_404(User, pk=request.user.pk)
context['logged_in_user'] = logged_in_user
return render(request, 'teams.html', context)
class Team(models.Model):
name = models.CharField(max_length=16)
logo = models.ImageField(upload_to='teams/avatars', default='static/img/userpreload.png')
background = models.ImageField(upload_to='teams/backgrounds', default='static/img/userpreload.png')
description = models.TextField(blank=True)
people_needed = models.PositiveSmallIntegerField()
members = models.ManyToManyField(User, through='TeamMembership')
accepts_applications = models.BooleanField()
@property
def teamleaders_listable(self):
leaders = self.members.filter(teammembership__leader=True)
string = leaders[0].extendeduser.nickname
for leader in leaders[1:]:
string += ", " + leader.extendeduser.nickname
return string
@property
def multiple_teamleaders(self):
if len(self.members.filter(teammembership__leader=True)) > 1:
return True
else:
return False
def __str__(self):
return self.name
Upvotes: 2
Views: 1025
Reputation: 309099
The key part of the traceback is:
File "/home/melonendk/webapps/victory_genki_dk/victory/staff/models.py" in teamleaders_listable
22. string = leaders[0].extendeduser.nickname
File "/home/melonendk/webapps/victory_genki_dk/lib/python3.6/Django-1.11.6-py3.6.egg/django/db/models/query.py" in __getitem__
289. return list(qs)[0]
Exception Type: IndexError at /teams/
Exception Value: list index out of range
This is telling you that leaders[0]
is failing because self.members.filter(teammembership__leader=True)
is an empty queryset.
You could change the code slightly to use ", ".join()
instead of looping through the queryset. This will return the empty string ''
when the queryset is empty.
@property
def teamleaders_listable(self):
leaders = self.members.filter(teammembership__leader=True)
return ", ".join(l.extendeduser.nickname for l in leaders)
Upvotes: 2