Шаблоны Google App Engine и Django: почему эти два случая отличаются?

1

Я новичок в Python, и я использую Google App Engine для создания простого блога, который поможет мне изучить его. У меня есть следующий тестовый код:

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, }))

И шаблон Django, который выглядит следующим образом:

{% 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 %} решает эту проблему, и это здорово.

Однако это бит, который я не понимаю; в другом шаблоне (для страницы архива), я передаю то же самое, список объектов Entry:

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 на entries.all; действительно, если я изменю это на то, что я не получаю никакого вывода (нет ошибок, просто ничего вообще).

Может кто-нибудь объяснить, почему это так?

Изменить: я изначально вставил неправильный фрагмент кода запроса для второго примера, что, вероятно, упростило бы людям дать мне ответ... изменило его сейчас.

Теги:
django-templates
google-app-engine

1 ответ

2
Лучший ответ

Вы хотите использовать .fetch(), а не get():

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

get() возвращает только первый элемент, который соответствует критериям запроса, поэтому вместо итеративной коллекции вы получите один экземпляр и объект Entry.

Я не могу объяснить, почему вторая версия работает. Кажется, это не так.

  • 0
    Вы правы, спасибо - и причина, по которой работает второй, заключается в том, что я скопировал неверный фрагмент кода: запрос архива фактически использовал fetch (limit = 100), как вы сказали.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню