2010-03-16 13 views
0

Je viens de finir le tutoriel Django et j'ai commencé à travailler sur mon propre projet, cependant, il semble que j'ai raté quelque chose complètement. Je voulais obtenir un slogan au hasard de ce modèle:Obtention d'un élément aléatoire dans Django

from django.db import models 

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

et le retourner dans ce point de vue:

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

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

Cependant, la vue retourne juste « objet Slogan ». Puis j'ai pensé, peut-être je peux accéder à la chaîne de slogan elle-même en ajoutant simplement .slogan à la tranche, mais cela me donne une erreur indiquant que l'objet que j'ai est réellement un QuerySet et n'a aucun slogan d'attribut.

J'ai évidemment mal compris quelque chose à propos de Django ici, mais ça ne me convient pas. De l'aide?

Répondre

3

OK, deux choses. Tout d'abord, la représentation par défaut d'une instance de modèle Django est "Modelname object". Pour changer ceci, définissez une méthode __unicode__ sur la classe - dans votre cas, vous voulez juste qu'elle renvoie self.slogan. Deuxièmement, votre tranche est un jeu de requête, car c'est ce que vous avez demandé avec [:1] - c'est-à-dire 'renvoyer une liste composée de tous les éléments jusqu'à l'élément 1'. Si vous voulez juste un seul élément, vous devez utiliser [0].

+0

Merci beaucoup, je l'ai eu. :) – Sarah

2

La tranche est erronée. [:1] génère une liste avec un élément (le premier), mais vous voulez probablement le premier élément sans la liste.

slogan = Slogan.objects.order_by('?')[0].slogan 
+0

Aussi une bonne réponse, désolé, je ne peux pas vous marquer tous les deux. – Sarah

Questions connexes