Melonendk
Melonendk

Reputation: 117

Django model.objects.all() gives list index out of range upon calling it normally

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

The view

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)

Model Team

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

Answers (1)

Alasdair
Alasdair

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

Related Questions