我正在尝试创建一个通用表视图,它采用模型和列名称元组,并显示模型的给定列。我的问题是内部的Meta类。
假设这两个模型:
# 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()
目标是使用单个视图生成包含给定顺序中某些列的正确表。所以,我有一个像这样的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 %}
时,我会得到一个空表(所以不可见),但是一个运行良好的分页器。
我的错误在哪里?
答案 0 :(得分:1)
解决。问题是关于Meta类:它在ModelTable初始化程序之前“存在”,因此在所述初始化程序中设置Meta属性是没有意义的。
启示出现this QA。
我要定义一个新方法,用于定义专门的类;这是我的新table.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})
现在它按预期工作了!
答案 1 :(得分:0)
提交的答案存在问题。
代码实际上不起作用,因为table_maker函数必须是这样的:
def table_maker(model, columns):
meta_class = type('Meta', (), {'model':model, 'fields':columns})
table_class = type(model._meta.object_name + 'Table', (ModelTable,), {'Meta':meta_class})
return table_class
请注意,不同之处在于元类不应该占用任何对象。 删除对象,它的工作原理:)
以下是参考资料:
相当于:
class X(object):
a = 1
将是这一个,(使用type
类制造者):
X = type('X', (object,), dict(a=1))
而不是object
我们有Meta:
然后我们需要放()