Queryset对象没有属性'Name'

时间:2012-12-11 14:06:03

标签: python django

我正在开展我的第一个django项目,我遇到了问题,显示了类别'从我的数据库到列表的网页。我收到错误"对象没有属性'名称'。到目前为止我的代码是:

型号:

class Category(models.model):
    name = models.Charfield(max_length=128)

def __unicode__(self):
    return self.Name + ": " +str(self.id)

查看:

from django.shortcuts import render_to_response, redirect
from forms.models import Form, Group, Flow, Gate, Field, Event, Category
from django.core.context_processors import csrf
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse

def homepage (request):

    CatName = Category.objects.order_by('id')

    output = {
        'category_name': CatName.Name,
    }

    return render_to_response('forms/formsummary.html', output)

HTML:

<div>{{ category_name }}</div>

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:2)

在Django中,当您使用ORM查询对象时,有两种可能性(不包括每种情况都不返回):

  • 查询只返回一个对象:如果是,则使用管理器的get()方法查询。
  • 查询返回一个集合:如果是,则使用all(),filter()或任何类似的方法进行查询。

在这种情况下,您的查询返回了 Category 对象的集合,您可以对此做一些事情,您可以使用列表解析生成仅包含名称的列表:< / p>

cnames = [c.name for c in Category.objects.all()]

或者您可以使用for循环迭代列表,并对每个对象执行任何操作。

Django已经通过 id 字段对您的数据进行了排序,因此,我想在这种情况下无需指定排序。

稍后,当您的视图返回时,您可以将列表传递到模板并进行迭代以提取您需要的内容,例如。

在您看来:

def get_categories(request):
    categories = Category.objects.all()
    context = {'categories': categories}
    return render_to_response('template.html', RequestContext(request, context))

然后,在您的模板中:

{% for c in categories %}
    <p>{{c.name}}</p>
{% endfor %}

这是一些有用的文档

希望这会有所帮助。

答案 1 :(得分:1)

似乎区分大小写,

def__unicode__(self):
  return self.Name + ": " +str(self.id)
              ^
              name 

答案 2 :(得分:0)

CatNameCategory个实例的集合。 CatName对象没有name属性,因为它不是Category对象。它包含Category个对象。

您可以遍历您的收藏并显示每个类别名称:

for category in CatName:
  print category.name

至少阅读QuerySet文档是好的,即使你还没有完全掌握它。

如果您只想要最近的类别,您可以执行以下操作:

def homepage (request):

    most_recent_category = Category.objects.order_by('-id')[0]

    output = {
        'category_name': most_recent_category.name
    }

    return render_to_response('forms/formsummary.html', output)