2010-07-25 11 views
1

l'application fonctionne de cette façon. Que j'ai simple modèle en ajoutant nouvelles comme ci-dessous:Object_list toujours vide

class News(models.Model): 
    title = models.CharField(max_length=100)  
    publication_date = models.DateField(auto_now_add=True) 
    content = models.TextField() 

la vue

def homepage(request): 
    posts= News.objects.all() #.get(title="aaa") 
    return render_to_response('homepage.html', {'a':posts}) 

et enfin le tamplate:

{% for b in a.object_list %} 
    <li> title:{{ b.title }}</li> 
{%empty %} 
    EMPTY 
{% endfor %} 

Malheureusement, il toujours sais 'EMPTY'. Cependant, si je prends l'option '.get (title = "aaa")' au lieu de '.all()' (la partie commentée) j'ai obtenu le bon titre et le contenu du message avec le titre 'aaa'. Quelqu'un peut-il expliquer ce que je fais mal? Merci d'avance pour votre expertise. Je suis désolé je n'ai pas écrit le modèle pour l'option get Bien sûr, la verion 'get' du modèle diffère. Il ressemble à ceci:

{{a.title}} {{a.content} 

Et il imprime le contenu du titre et message attendu Ainsi, le « get » fonctionne avec le modèle et le « pour » ne pas itérer sur le QuerySet retourné par tous(). Je suis débutant mais object_list est censé être la représentation de querySet passée en render_on_request en tant qu'élément du dictionnaire?

Répondre

0

Lorsque vous utilisez obtenir, les variables messages contient une instance de Nouvelles. D'autre part, si vous utilisez .all(), les messages contiendront un queryset. Alors d'abord je vous suggère d'utiliser filtre au lieu de se , donc messages serait toujours un queryset, et donc vous n'auriez pas un tel comportement incohérent ...

0

S'il vous plaît poster le code exact que vous sont en train de courir. Il est impossible que l'une de vos alternatives fonctionne avec a.object_list, car il n'existe aucune définition de object_list et ce n'est pas une propriété Django intégrée.

Et en supposant que vous voulez dire en fait que for b in a ne fonctionne pas dans le premier code, mais fait dans le second, ce n'est pas vrai non plus, car avec .get vous n'aurez rien à itérer avec for. Cependant, supposons que ce que vous avez réellement fait est de passer les résultats de .all() au modèle, et que le modèle n'a pas la boucle for. Cela ne fonctionnerait pas, car all() - comme filter() - renvoie un QuerySet, qui doit être itéré à travers. Pour la même raison, get() ne fonctionnerait pas avec une boucle for.

Édité après le commentaire "object_list est censé être la représentation de querySet passée dans render_on_request" - non, ce n'est pas le cas. D'où tiens-tu cette idée? Si vous transmettez un jeu de requête appelé a au modèle, vous parcourez a, rien d'autre.object_list est le nom utilisé par défaut dans les vues génériques pour le jeu de requête lui-même - c'est-à-dire ce que vous avez appelé a - mais dans vos propres vues vous l'appelez comme vous voulez et l'utilisez avec le nom que vous lui avez donné.

Édité après le deuxième commentaire Je ne sais pas pourquoi cela devrait prêter à confusion. Vous avez inventé un besoin pour object_list où il n'y a pas de telle variable, et pas besoin d'un. Faites comme je l'ai dit à l'origine - {% for b in a %}.

+0

Je suis désolé de ne pas avoir écrit le modèle pour l'option get bien sûr le hors verion « get » du modèle diffère. Il ressemble à ceci: {{a.title}} {{a.content} Et cela fonctionne en imprimant le titre attendu et le contenu du message Ainsi le 'get' fonctionne avec le template et le 'for' n'a pas itéré sur le QuerySet retourné par all(). Je suis débutant mais object_list est censé être la représentation de querySet passée en render_on_request en tant qu'élément du dictionnaire? – user401577

+0

Eh bien, cela semble confus. Le code que je vous ai donné est tout ce que j'ai mis du tutoriel sur lequel j'ai travaillé. Qu'est-ce qui manque alors? Je veux juste distuire dans le 'for' tag toutes les entrées de blog simples avec le titre, le contenu. Où et comment devrait être la «définition de liste d'objets» Vous avez mentionné mettre? – user401577

0

Lorsque vous voulez itérer sur quelque chose comme ceci:

for object in object_list: 
    print object 

object_list doit itérer soutenir. liste, tuple, dict, et d'autres types le supportent. Vous pouvez définir votre propre classe d'itérateur en lui attribuant une méthode iter. Voir the docs pour cela.

Maintenant, dans votre exemple

return render_to_response('homepage.html', {'a':posts}) 
messages

est une instance queryset qui soutient itérer. Pensez-y de cette façon:

{% for b in News.objects.all %} 

c'est ce que vous aimeriez avoir, mais ce que vous avez fait est la suivante:

{% for b in News.objects.all.object_list %} 

Mais News.objects.all ne dispose pas d'un attribut object_list!

News.objects.all est ce que votre object_list devrait être, donc il suffit d'écrire:

{% for b in a %} 
Questions connexes