Skip to main content
 首页 » 编程设计

python之django-tables2 : Table subclassing and Meta inner class attributes

2025年05月04日36zengkefu

我正在尝试创建一个通用 TableView ,它采用一个模型和一个列名元组,并显示模型的给定列。我的问题是内部元类。

假设这两个模型:

# models.py 
 
from django.db import models 
 
 
class Model_a(models.Model): 
    column_a_1 = models.Field()  
    column_a_2 = models.Field() 
    column_a_3 = models.Field() 
    column_a_4 = models.Field() 
    column_a_5 = models.Field() 
 
 
class Model_b(models.Model): 
    column_b_1 = models.Field()  
    column_b_2 = models.Field() 
    column_b_3 = models.Field() 
    column_b_4 = models.Field() 
    column_b_5 = models.Field() 

目标是拥有一个单一 View ,该 View 可以生成正确的表格,其中某些列按给定顺序排列。所以,我有一个像这样的 urls.py:

# urls.py 
 
from django.conf.urls import patterns, url 
import myapp.views as myviews 
import myapp.models as mymodels 
 
 
urlpatterns = patterns( '', 
                       url( r'^table_a/$', 
                            myviews.show_table, 
                            { 'model': mymodels.Model_a, 
                              'columns': ("column_a_1", "column_a_2", "column_a_3") } ), 
                       url( r'^table_b/$', 
                            myviews.show_table, 
                            { 'model': mymodels.Model_b, 
                              'columns': ("column_b_5", "column_b_2") } ) ) 

还有一个像这样的简单 views.py:

# views.py 
 
from django.shortcuts import render 
from django_tables2 import RequestConfig 
import myapp.tables as mytables 
 
 
def show_table(request, model, columns): 
    entries = model.objects.all() 
    table = mytables.ModelTable(entries, model, columns) 
    RequestConfig(request).configure(table) 
    return render(request, 'table_view.html', {'dynamic-table': table}) 

关键在 Table 子类中,在 tables.py 中:

# tables.py 
 
from django_tables2 import import Table 
 
 
class ModelTable(Table): 
 
    class Meta: 
        pass 
 
    def __init__(self, data, model, columns, order_by=None, orderable=None, empty_text=None, 
                 exclude=None, attrs=None, sequence=None, prefix=None, 
                 order_by_field=None, page_field=None, per_page_field=None, 
                 template=None, sortable=None, default=None): 
        self.Meta.model = model 
        self.Meta.fields = columns 
        self.Meta.sequence = columns 
        super(ModelTable, self).__init__(data, order_by, orderable, empty_text, 
                 exclude, attrs, sequence, prefix, 
                 order_by_field, page_field, per_page_field, 
                 template, sortable, default) 

显然,我不明白如何从 Table 子类初始值设定项设置 Table.Meta 的属性。 奇怪的是,当我在我的模板中使用 {% render_table dynamic-table %} 时,我得到一个空表(因此不可见),但是一个工作良好的分页器。

我的错误在哪里?

请您参考如下方法:

已解决。问题出在 Meta 类上:它“存在”于 ModelTable 初始化程序之前,因此在所述初始化程序中设置 Meta 属性毫无意义。

启示来自阅读this QA .

我必须定义一个新方法来动态定义特殊类;这是我的新 tables.py :

# tables.py 
 
from django_tables2 import import Table 
 
 
class ModelTable(Table): 
    class Meta: 
        pass 
 
 
def table_maker(model, columns): 
    meta_class = type('Meta', (ModelTable.Meta,), {'model':model, 'fields':columns}) 
    table_class = type(model._meta.object_name + 'Table', (ModelTable,), {'Meta':meta_class}) 
    return table_class 

因此 views.py 也发生了一点变化:

# views.py 
 
from django.shortcuts import render 
from django_tables2 import RequestConfig 
import myapp.tables as mytables 
 
 
def show_table(request, model, columns): 
    entries = model.objects.all() 
    table = mytables.table_maker(model, columns)(entries) 
    RequestConfig(request).configure(table) 
    return render(request, 'table_view.html', {'dynamic-table': table}) 

现在它按预期工作了!