2010-10-17 6 views
0

Ceci est un code de vue exemplecomment voulez-vous itérer sur une liste django

def link(reqest): 
    title = ['Home Page', 'Current Time', '10 hours later'] 
    return render_to_response('time.html', title) 

Ceci est un code de modèle exemple

{% for item in title %} 
    {{item}} 
    {% if not forloop.last %} | {% endif %} 
{% endfor %} 

Ce code url exemple

(r'^now/$', current_time, link), 

Cependant, j'obtiens une erreur

TypeError at /now/

'function' object is not iterable

Je sais que cela fonctionne en Python. Comment oses-tu iter en django, alors?

Merci pour toute contribution à l'avance!


de la page d'erreur de django

TypeError at /now/

'function' object is not iterable

Request Method: GET Request URL: http://127.0.0.1:8000/now/ Django Version: 1.2.3 Exception Type: TypeError Exception Value:

'function' object is not iterable

Exception Location: C:\Python27\lib\site-packages\django\core\urlresolvers.py in resolve, line 121 Python Executable: C:\Python27\python.exe Python Version: 2.7.0 Python Path: ['C:\Documents and Settings\JohnWong\workspace\mysite\mysite', 'C:\Documents and Settings\JohnWong\workspace\mysite', 'C:\Python27', 'C:\Python27\DLLs', 'C:\Python27\lib', 'C:\Python27\lib\lib-tk', 'C:\Python27\lib\plat-win', 'C:\Python27\lib\site-packages', 'C:\WINDOWS\system32\python27.zip'] Server time: Sat, 16 Oct 2010 22:45:36 -0400

Environment:

Request Method: GET Request URL: http://127.0.0.1:8000/now/ Django Version: 1.2.3 Python Version: 2.7.0 Installed Applications: ['django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages'] Installed Middleware: ('django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware')

Traceback: File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response 91. request.path_info) File "C:\Python27\lib\site-packages\django\core\urlresolvers.py" in resolve 217. sub_match = pattern.resolve(new_path) File "C:\Python27\lib\site-packages\django\core\urlresolvers.py" in resolve 121. kwargs.update(self.default_args)

Exception Type: TypeError at /now/ Exception Value: 'function' object is not iterable

Répondre

0

C'est sur la façon dont vous spécifiez le contexte pour le modèle, je crois. Essayez de retourner un dictionnaire à la place, avec title l'intérieur de celui-ci:

return render_to_response('time.html', {"title":title}) 

puis itérer aime:

{% for item in title %} 
    {{ item }} 

etc.

Notez que vous avez besoin de deux crochets autour item dans la boucle, plutôt d'un.


Maintenant que vous avez ajouté l'info, je vois l'erreur vient avant que la vue est même exécuté (bien que vous auriez eu quelques fois que vous avez là aussi).

La spécification d'URL prend un appel comme son deuxième argument. Vous avez quelques variables sur là -

(r'^now/$', current_time, link),# that isn't a proper reference to the 'link' function, and it can't come second 

Il devrait être quelque chose comme

(r'^articles/(?P<current_time>\(?P<link>)/$', 'project_name.views.link'), #the second tuple element is the view function 

et pour tenir compte des variables que vous passez, apparemment dans l'URL, (aussi, assurez-vous d'avoir ' request 'et non' reqest 'pour garder les choses droites)

def link(request,current_time,link): 
+0

J'ai essayé et votre méthode de l'affiche précédente, et je reçois toujours la même erreur. si étrange. – CppLearner

+0

@JohnWong avez-vous inspecté la section contexte/variables locales de la page d'erreur de Django pour voir quelles entrées il a pour 'list' ou' title'? – JAL

+0

Je suis assez nouveau pour django. A côté du réglage, le reste est posté (j'ai mis à jour le fil). Je ne vois pas une erreur liée à la liste du tout? – CppLearner

0

Vous n'avez pas créé de contexte. Vous passez une liste où un contexte est nécessaire et en utilisant un nom de vue dans le modèle. Essayez ceci:

def link(request): 
    c = Context()  
    c['titles'] = ['Home Page', 'Current Time', '10 hours later'] 
    return render_to_response('time.html', c) 

puis:

{% for item in titles %} 
    {{item}} 
    {% if not forloop.last %} | {% endif %} 
{% endfor %} 
+1

Si vous utilisez 'render_to_response', vous pouvez simplement spécifier un dictionnaire plutôt qu'un objet de contexte. – JAL

1

Vous essayez de itérer sur cette chose, non?

title = ['Home Page', 'Current Time', '10 hours later'] 

Eh bien, link est une fonction (vous def « d, rappelez-vous?) donc vous ne pouvez pas simplement accéder à title comme ça. Ce code ne fonctionnera pas en Python. Si vous essayez ceci:

def link(reqest): 
    title = ['Home Page', 'Current Time', '10 hours later'] 
    return render_to_response('time.html', title) 

for item in link.title: 
    print title 

Vous aurez également une erreur:

AttributeError: 'function' object has no attribute 'title'

Questions connexes