tags:

views:

41

answers:

2

I just finished the Django tutorial and started work on my own project, however, I seem to have missed something completely. I wanted to get a random slogan from this model:

from django.db import models

class Slogan(models.Model):
        slogan = models.CharField(max_length=200)

And return it in this view:

from django.http import HttpResponse
from swarm.sloganrotator.models import Slogan

def index(request):
        return HttpResponse(Slogan.objects.order_by('?')[:1])

However, the view just returns 'Slogan object'. Then I thought, maybe I can access the slogan string itself by simply appending .slogan to the slice, but that gives me an error indicating that the object I have is actually a QuerySet and has no attribute slogan.

I've obviously misunderstood something about Django here, but it just doesn't fall into place for me. Any help?

+2  A: 

OK, two things.

Firstly, the default string representation of a Django model instance is "Modelname object". To change this, define a __unicode__ method on the class - in your case, you just want it to return self.slogan.

Secondly, your slice is a queryset, because that's what you've asked for with [:1] - ie 'return a list consisting of all elements up to element 1'. If you just wanted a single element, you should use [0].

Daniel Roseman
Thank you very much, I got it. :)
Sarah
+2  A: 

The slice is wrong. [:1] generates a list with one element (the first) in it, but you want probably the first element without the list.

slogan = Slogan.objects.order_by('?')[0].slogan
tux21b
Also a great answer, sorry I can't mark you both.
Sarah