2010-01-23 1 views
1

저는 Python을 처음 사용합니다. Google App Engine을 사용하여 간단한 학습을 ​​통해 블로그를 배울 수 있습니다.Google App Engine 및 Django 템플릿 :이 두 가지 사례가 다른 이유는 무엇입니까?

entries = db.Query(Entry).order("-published").get() 
     comments = db.Query(Comment).order("published").get() 
     self.response.out.write(template.render(templatePath + 'test.django.html', { 'entries': entries, 'comments': comments, })) 

그리고 다음과 같습니다 장고 템플릿 : 내가 브라우저에서이 템플릿 페이지를 볼 때

{% extends "master.django.html" %} 

{% block pagetitle %}Test Page{% endblock pagetitle %} 

{% block content %} 

{% for e in entries %} 

<p><a href="/post/{{ e.slug }}/">{{ e.title|escape }} - {{ e.published|date:"jS o\f F Y" }}</p> 

{% endfor %} 

{% for c in comments.all %} 

<p>{{ c.authorname }} {{ c.published|date:"d/m/Y h:i" }}</p> 

{% endfor %} 

{% endblock content %} 

, 내가 얻을 :

TypeError: 'Entry' object is not iterable 

나는 다음과 같은 테스트 코드를 {% for e in entries %} 줄을 {% for e in entries.all %}으로 변경하면이 문제가 해결되므로 큰 문제입니다.

그러나 이것은 이해할 수없는 부분입니다. (아카이브 페이지) 다른 템플릿에, 나는 같은 일을 전달, 항목의 목록은 오브젝트 :

entries = db.Query(Entry).order("-published").fetch(limit=100) 
     self.response.out.write(template.render(templatePath + 'archive.django.html', { 'entries': entries, })) 

을 템플릿으로 다음과 같이이 코드는 잘 작동

{% extends "master.django.html" %} 

{% block pagetitle %}Home Page{% endblock pagetitle %} 

{% block content %} 

<ul> 

{% for entry in entries %} 

<li><a href="/post/{{ entry.slug }}/">{{ entry.title|escape }} <span>{{ entry.published|date:"jS o\f F Y" }}</a>{% if admin %} - <a href="/compose/?key={{ entry.key }}">Edit Post</a>{% endif %}</span></li> 

{% endfor %} 

{% endblock content %} 

, 없이 변경 entries to entries.all; 참으로 만약 내가 을 수행하면은 출력을 얻지 못한다. (아무런 오류도 없다.

누군가가이 문제를 설명 할 수 있습니까?

편집 : 원래 두 번째 예제에 대한 잘못된 쿼리 조각을 붙여 넣었습니다. 그러면 사람들이 내게 답변을 더 쉽게 제공 할 수있게되었습니다 ... 지금 변경했습니다.

답변

2

당신은) (하지) (.fetch 사용하려면 :

entries = db.Query(Entry).order("-published").fetch() 
comments = db.Query(Comment).order("published").fetch() 

의 get()는 쿼리 기준과 일치하는 첫 번째 항목을 반환, 그래서 대신 반복 가능한 수집, 당신은 얻을 것이다 하나의 인스턴스 및 Entry 객체가 있습니다.

두 번째 버전이 작동하는 이유를 설명 할 수 없습니다. 그렇게해서는 안되는 것처럼 보입니다.

+0

맞아요, 고마워요. 제가 두 번째 코드가 잘못된 코드를 복사했기 때문입니다. 아카이브 쿼리는 실제로 fetch (limit = 100)를 사용하고있었습니다. –

관련 문제