1

我正在处理我的第一个 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>

谁能指出我正确的方向?

4

3 回答 3

3

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

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

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

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 %}

这里有一些有用的文档

希望这可以帮助。

于 2012-12-11T14:37:43.150 回答
1

好像区分大小写,

def__unicode__(self):
  return self.Name + ": " +str(self.id)
              ^
              name 
于 2012-12-11T14:45:38.300 回答
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)
于 2012-12-11T14:29:57.260 回答