如何将Queryset呈现到表模板-django中

时间:2012-02-09 06:27:45

标签: python django templates django-queryset

我有一个定义如图所示的模型,该模型对查询起作用并获取必须放在表的适当单元格中的对象列表。这是代码的相关部分。

class Location(models.Model):
    x=models.IntegerField(null=True)
    y=models.IntegerField(null=True)
    z=models.CharField(max_length=5,null=True)

    def __unicode__(self):
        return self.z

从这个db我希望检索所有对象并将它们放在一个2d表中,其中行和列由该对象的x,y定义。如果没有对象(x,y)那么该特定的插槽应该在表中显示为空。这是我为满足这些目的所写的观点。

def gettable(request):
    events=[]
    for xdim in xrange(3):
        xe=[]
        for ydim in xrange(3):
            object=[0]
            object.append(Location.objects.filter(x=xdim,y=ydim))
            xe.append(object[-1])
            events.append(xe)
    return render(request, 'scheduler/table.html', {'events':events})

这是代码的html部分

<table border="1">
    <th>Header 0</th>
    <th>Header 1</th>
    <th>Header 2</th>
    {% for event in events %}
    <tr>
    {% for x in event %} <td>{{ x }}</td>
    {% endfor %}
    </tr>
    {% endfor %}
</table>

我必须在这里解决多个问题。

1.我的视图代码一点也不优雅(这很糟糕因为我知道django提供了很多东西来处理这些任务)因为我定义的变量专门用于循环而不是从(x,y)中获取)数据库对象的值。

2.我以[<Location: 21>]格式输出,但我希望它为'21'。

3.如何在不存在给定(x,y)的任何对象的情况下引入空单元格。

4.请建议任何其他可能使我的代码更简单和一般的方法。

3 个答案:

答案 0 :(得分:16)

如果您想使代码更简单,我建议您使用应用程序django-tables2。这种方法可以解决有关生成表的所有问题。

作为文档sais:

  

django-tables2简化了将数据集转换为HTML的任务   表。它具有对分页和排序的原生支持。它的确如此   HTML表格django.forms为HTML表单做什么。 e.g。

     

其功能包括:

     
      
  • 任何可迭代都可以是数据源,但包含对Django查询集的特殊支持。
  •   
  • 内置用户界面不依赖JavaScript。
  •   
  • 支持基于Django模型的自动表生成。
  •   
  • 通过子类化支持自定义列功能。
  •   
  • 分页。
  •   
  • 基于列的表格排序。
  •   
  • 模板标记,用于启用对HTML的简单渲染。
  •   
  • 用于Django 1.3的通用视图mixin。
  •   
     

创建表格非常简单:

import django_tables2 as tables

class SimpleTable(tables.Table):
    class Meta:
        model = Simple 
     

然后将在视图中使用:

def simple_list(request):
    queryset = Simple.objects.all()
    table = SimpleTable(queryset)
    return render_to_response("simple_list.html", {"table": table},
                              context_instance=RequestContext(request))
     

最后在模板中:

{% load django_tables2 %} 
{% render_table table %}
     

此示例显示   最简单的案例之一,但django-tables2可以做更多!校验   documentation了解更多详情。

也可以使用字典而不是查询集。

答案 1 :(得分:1)

每点:

  1. IMO您可以创建自定义过滤器或标记并使用查询集。
  2. 您需要定义__unicode__(或__string__)方法才能返回所需的项目。
  3. 如果值为空或项目不存在,则渲染结果也将为空。
  4. HTH

答案 2 :(得分:1)

对于第2点,你给每个单元格一个列表而不是单个对象,{{x.0}}应该给你正确的值,但它也暗示你在视图逻辑中接近错误。