如何使用django-tables2在一个视图中显示多个表?

时间:2014-12-22 17:37:34

标签: python view multiple-tables django-tables2

使用djt2 v0.15 / dj1.6 / pyth2.6.6

djt2 doc示例查看多个表的文件:

def people_listing(request) :

    config = RequestConfig(request)
    table1 = PeopleTable(Person.objects.all(), prefix="1-")
    table2 = PeopleTable(Person.objects.all(), prefix="2-")
    config.configure(table1)
    config.configure(table2)
    return render(request, "people_listing.html",
        {"table1": table1, "table2": table2})

这个例子首先对于引用的" table1"," table2"而言似乎是不正确的。参数。我的测试显示了定义名称" people_list"需要在引号中使用,至少在一个表上。除此之外,为什么有人想要两次显示同一张桌子?这是一个坏榜样吗?这是我的应用程序尝试使用此结构:

def AvLabVw(request):

    config = RequestConfig(request)
    cmutbl = CmuTable(CmuVersion.objects.all(), prefix="1-")
    simtbl = SimTable(Simulator.objects.all(), prefix="2-")
    config.configure(cmutbl)
    config.configure(simtbl)
    return render(request, "AvRelInfo.html", {"AvLabVw":cmutbl, "AvLabVw":simtbl})

url文件在AvLabVw上获取,html模板使用render_table。

{% render_table AvLabVw %}

此代码发生的情况是,仍然只显示一个表,以返回渲染行中的最后一个为准。

在文档的其他地方,它说需要使用带有get_context_data的SingleTableView,但我还没有想到......

我尝试了这种样式实现,我认为它需要一个表对象和一个列表对象?

views.py

from django_tables2 import views
from django_tables2 import SingleTableView
from django_tables2 import SingleTableMixin
from django.shortcuts import render
from django_tables2   import RequestConfig

def SimVers_lst(request):

     return render(request, 'AvRelInfo.html', {'SimVers_lst' : Simulator.objects.all()})

def AvLabVw(request):

    config = RequestConfig(request)
    simlst = SimVers_lst(Simulator.objects.all())
    table = CmuTable(CmuVersion.objects.all(), prefix="1-")
    Stv = views.SingleTableView()
    multitbl = Stv.get_context_data()
    config.configure(multitbl)
    return render(request, "AvRelInfo.html", { "AvLabVw" : multitbl })

html模板中{% render_table AvLabVw %}处的barfs与通常的catch-all "ValueError at /AvCtlapp/ Expected table or queryset, not 'str'." ...得到一些垃圾...我想我可以试着看看它在shell中得到了什么,如果我可以设置那个测试......

感谢您的帮助......

PS:是否需要自定义渲染,看起来如何?

1 个答案:

答案 0 :(得分:1)

您的第一个代码示例(它是从django-tables2文档中复制的)用于在一个页面中呈现两个表。它不是一个坏的例子(我认为),因为它展示了如何使用具有不同前缀的相同查询集从同一个表类呈现2个表。

最后一个代码示例来自您的问题,您使用SingleTableView时出错了。它意味着在模板中渲染一个表,它基本上是一个基于类的视图。试试这样:

class AvLabVw(SingleTableView):
    model = Simulator
    template_name = 'AvRelInfo.html'
    table_class = SimulatorTable

和模板如:

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

现在,如果要渲染多个表,请从此视图覆盖get_context_data()方法,如下所示:

class AvLabVw(SingleTableView):
    model = Simulator
    template_name = 'AvRelInfo.html'
    table_class = SimulatorTable


def get_context_data(self, **kwargs):
    context = super(AvLabVw, self).get_context_data(**kwargs)
    context['table_cmu'] =  CmuTable(CmuVersion.objects.all(), prefix="1-")
    return context

和模板如:

{% load render_table from django_tables2 %}
{% render_table table %}
{% render_table table_cmu %}

和网址:

url(r'^something/$', AvLabVw.as_view(), name='avlabvw'),