【问题标题】:how to render a Queryset into a table template-django如何将 Queryset 渲染成表格模板-django
【发布时间】:2012-03-01 15:48:30
【问题描述】:

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

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

我想从这个数据库中检索所有对象并将它们放在一个二维表中,其中行和列由该对象的 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.我得到[&lt;Location: 21&gt;] 格式的输出,但我希望它为“21”。

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

4.请提出任何其他可能使我的代码更简单和通用的方法。

【问题讨论】:

    标签: python django templates django-queryset


    【解决方案1】:

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

    正如文档所说:

    django-tables2 简化了将数据集转换为 HTML 的任务 表。它具有对分页和排序的本机支持。它为 HTML 表格 django.forms 对 HTML 表单的作用。例如

    它的特点包括:

    • 任何可迭代对象都可以是数据源,但包括对 Django 查询集的特殊支持。
    • 内置 UI 不依赖于 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

    也可以使用字典代替查询集。

    【讨论】:

    • 渲染现在更简单了:return render(request, 'simple_list.html', {"table": table})
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      每点:

      1. IMO 您可以通过创建自定义过滤器或标签并使用查询集来摆脱困境。
      2. 您需要定义一个__unicode__(或__string__)方法来返回您想要的项目。
      3. 如果值为空或该项不存在,则渲染结果也将为空。

      HTH

      【讨论】:

        猜你喜欢
        • 2013-10-10
        • 2023-03-06
        • 2017-10-13
        • 2022-07-22
        • 2018-11-30
        • 1970-01-01
        • 2020-10-21
        • 2018-05-20
        • 2018-11-05
        相关资源
        最近更新 更多