【问题标题】:My object is not iterable我的对象不可迭代
【发布时间】:2014-03-03 20:50:33
【问题描述】:

我的模型和模板有问题,我确信模型处于最佳状态。我点击主页上的链接,我得到一个错误:'BlogPost' object is not iterable

我有一个model.py:

from django.db import models

# Create your models here.
class BlogPost(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    create_at = models.DateTimeField()

    def __unicode__(self):
        return self.title

url.py:

from django.conf.urls import patterns, url
from app import views

urlpatterns = patterns('',
    url(r'^$', views.index, name="index"),
    url(r'^(?P<app_id>\d+)/$', views.detail, name='detail'),
    url(r'^(?P<app_id>\d+)/result$', views.result, name="result"),
    url(r'^(?P<app_id>\d+)/vote$', views.vote, name="vote"),
)

和views.py:

from models import BlogPost
from django.http import HttpResponse, Http404
from django.template import RequestContext, loader
from django.shortcuts import render, get_object_or_404, render_to_response

def index(request):
    posts = BlogPost.objects.all()
    context = {'posts': posts}
    return render(request, 'base.html', context)

def detail(request, app_id):
    posts = BlogPost.objects.get(pk=app_id)
    return render_to_response('app/detail.html', {"posts": posts}, context_instance=RequestContext(request))

def result(request, app_id):
    return HttpResponse("To jest strona z wynikami %s" % app_id)

def vote(request, app_id):
    return HttpResponse("Yo tu powinna byc strona z glosowaniem, ale to inny projekt %s" % app_id)

我得到这个错误:

'BlogPost' object is not iterable

Request Method:     GET
Django Version:     1.6.2
Exception Type:     TypeError
Exception Value:    

'BlogPost' object is not iterable

Exception Location:     /app/.heroku/python/lib/python2.7/site-packages/django/template/defaulttags.py in render, line 155
Python Executable:  /app/.heroku/python/bin/python
Python Version:     2.7.6
Python Path:    

['/app',
 '/app/.heroku/python/bin',
 '/app/.heroku/python/lib/python2.7/site-packages/distribute-0.6.36-py2.7.egg',
 '/app/.heroku/python/lib/python2.7/site-packages/setuptools-2.1-py2.7.egg',
 '/app/.heroku/python/lib/python2.7/site-packages/pip-1.5.4-py2.7.egg',
 '/app',
 '/app/.heroku/python/lib/python27.zip',
 '/app/.heroku/python/lib/python2.7',
 '/app/.heroku/python/lib/python2.7/plat-linux2',
 '/app/.heroku/python/lib/python2.7/lib-tk',
 '/app/.heroku/python/lib/python2.7/lib-old',
 '/app/.heroku/python/lib/python2.7/lib-dynload',
 '/app/.heroku/python/lib/python2.7/site-packages']

Server time:    Mon, 3 Mar 2014 20:32:14 +0000

这是我的模板中的错误:

Error during template rendering
In template /app/app/templates/base.html, error at line 34

    24  <p><a class="btn btn-lg btn-success" href="#" role="button">Sign up today</a></p>
    25  </div>
    26  {% endblock %}
    27  
    28  {% block content %}{% endblock %}
    29  
    30  
    31  <div class="row marketing">
    32  <div class="container">
    33  {% if posts %}
    34  {% for p in posts %}
    35  <h1><a href="{% url 'detail' p.id %}">{{ p.title }}</a></h1>
    36  <b>{{ p.create_at}}</b>
    37  <p>{{ p.body }}</p>
    38  {% endfor %}
    39  {% else %}
    40  <p>Nie ma zadnych pol do wyswietlenia</p>
    41  {% endif %}
    42  </div>
    43  </div>
    44  

请帮忙。

【问题讨论】:

  • 这个问题已经解决了。谢谢你的时间:)

标签: python django templates object rendering


【解决方案1】:

您不能迭代 get() 查询。您有以下内容:

views.py

posts = BlogPost.objects.get(pk=app_id)

模板

{% for p in posts %}  {% comment %} won't work {% endcomment %}

filter() 始终返回一个 QuerySet(可迭代),而 Manager 上的 get() 方法始终直接返回单个对象(因此不可迭代)。

你可以在你的模板中试试这个:

{% if posts %} {% comment %} no for clause {% endcomment %}
    <h1><a href="{% url 'detail' posts.id %}">{{ posts.title }}</a></h1>
    <b>{{ posts.create_at}}</b>
    <p>{{ posts.body }}</p>
{% endif %}

【讨论】:

  • 很高兴为您提供帮助。 @karthikr 我是吗?嗯,现在应该修好了。对此感到抱歉,感谢您的关注。
  • 没关系.. OP 很高兴,您的解决方案有效 :) +1
猜你喜欢
  • 1970-01-01
  • 2011-08-09
  • 2014-04-26
  • 2019-11-12
  • 2017-01-05
  • 2015-11-11
  • 2021-06-06
  • 2013-05-27
  • 2013-08-02
相关资源
最近更新 更多