Django-tables2: 元选项不会被继承。

创建于 2012-07-15  ·  17评论  ·  资料来源: jieter/django-tables2

你好,

我有以下表格:-

    class BaseTable(tables.Table):
        select_column = tables.CheckBoxColumn(verbose_name='', empty_values=('NA',))

        class Meta:
            attrs = {'class' : 'cool_table'}

    class EditableTable(BaseTable):
        edit_column = EditIconColumn(verbose_name=_('Edit'))

        def set_editable(self, flag):
            if flag:
                self.base_columns['edit_column'].visible = True
            else:
                self.base_columns['edit_column'].visible = False   

    class RoomTable(EditableTable):
        number = tables.Column()
        speciality = tables.Column()
        photo = ImageViewColumn(accessor='room_type.photo')

当我渲染RoomTable ,生成的<table>没有class属性。 我能够只获得该属性,当我移动(或复制) Meta从类BaseTableRoomTable

这是错误还是我使用不当?

所有17条评论

感谢您的报告,这是一个错误。 它现在在我的待办事项列表的顶部。

谢谢。

所以我几乎已经完成了对此的解决方案,然后我记得对于Meta继承,我遵循了 Django 风格,即

class Meta(Parent.Meta):
    ...

所以现在我开始怀疑偏离它是否真的是一个好主意。 我想无论如何它总是不一致的,在django_tables2.Table的第一个子类中你_不需要_需要做class Meta(django_tables2.Tables): ,但是对于任何进一步的子类你_do_。

我想你可以说虽然没有django_tables2.Table.Meta API,但它只在第一个子类 _starts_ 。 你对此有什么感觉? 您是否知道 Django 模型的 Meta 继承是如何工作的,并希望它在这里有所不同? 或者你对 Django 的 API 太天真了,所以你只是尝试了感觉_正确_?

我刚刚重新阅读了您的原始问题,您的问题似乎是您甚至没有尝试更改子类中的元选项,您只是尝试子类化并添加列。

抱歉,我不太明白你在说什么,但是是的,我所做的感觉是对的。 无论如何,我对 Meta 的东西很陌生,所以我的方法可能不太好。

布拉德利,

喜欢这个项目的工作。 我在这里遇到了与 applegrew 相同的问题,您的最后一条评论完全符合我的情况。

### Table Definitions ###
# parent class 
import django_tables2 as tables

# generic parent class to handle table styling
class MyAppTable(tables.Table):
    class Meta:
        attrs = {'class': 'render-table'}


# subclass in a separate app
from myapp_helpers.tables import MyAppTable
from django_tables2.utils import A
import django_tables2 as tables

class ItemTable(MyAppTable):

    address_1 = tables.Column()
    address_2 = tables.Column()
    address_3 = tables.Column()
    city = tables.Column()
    state = tables.Column()
    zipcode = tables.Column()

    # need this to fix a bug with the meta class not passing through to subclasses in django-tables2
    class Meta(MyAppTable.Meta):
        pass


## Views ##

# class based view in separate app
from django_tables2 import SingleTableView

# Parent class to make pagination the same across views
class MyAppListView(SingleTableView):

    # default of 10 rows in every table on every page
    table_pagination = {"per_page": 10 }
    template_name = 'generic_list.html'


# subclass of view in local app
class ItemListView(MyAppListView):
    model = Item
    table_class = ItemTable

如果类 Meta 定义未放置在 ItemTable 中,则不会发送在父类中设置的元属性。 我希望将相同的属性发送到我的应用程序中的所有表(最终从 MyAppTable 继承)

在从父 Meta 类 (MyAppTable) 继承的 ItemTable 中定义空的 Meta 类是可行的,但似乎违反了 DRY 原则,即使它只有两行并且仍然满足我只需要将 CSS 类更改为一个的要求我需要的地方。 欣赏作品! 谢谢你。

我知道你来自哪里,我倾向于同意你的观点,事实上我已经部分地编写了一个补丁来实现这一点,但是这种方法与 Django 使用模型的方法相矛盾。 然而,我目前的立场是让事情以与 Django 类似的方式工作对于让库按预期工作很重要。

你认为它真的值得打破 Django + Python 的标准行为吗?

我只使用 Django/Python 开发了大约一个月,我认为我没有资格为打破常规提出论点。 我想有几个选择。 你可以:

a) 记录上面详述的解决方法(如果还没有,我可能已经错过了)。 真的没有那么可怕。
b) 提供一个像“inherit_meta = False”这样的属性,可以在子类中覆盖,以允许子类继承元信息。 默认值为 false 以保持事情按照 Django 标准工作,但允许更多喜欢冒险/懒惰的人(例如我自己)消除对重复 Meta 类定义的需要。 我看到的唯一问题是为解决方法维护额外的代码块,这可能会引入错误(数据出现在不期望的情况下)等。
c) 将此行为设为新的默认值。

甚至在我写这篇文章的时候,我已经可以在我的脑海中看到一些场景,其中基于没有发生继承的事实检查模板变量,发生了破坏,我花了几个小时在代码周围摸索却发现它坏了,因为我手动覆盖该行为。 它也不匹配任何现有示例。

坦率地说,这可能不值得付出努力。 我宁愿在文档中看到有关元继承“陷阱”的额外说明,也不愿尝试在变通方法中编码以生成非典型行为。

关于 a),你这样做:

class Parent(tables.Table):
    class Meta:
        foo = 1

class Child(Parent):
    class Meta(Parent.Meta):
        bar = 2

Child.Meta现在有foo = 1 _and_ bar = 2

我倾向于同意这可以通过文档来解决。

谢谢。 我实际上在基于 applegrew 示例的示例中进行了此操作。

呵呵,说得好。

解决方法的一个烦恼是您无法覆盖 Parent 类中的某些内容:

class Parent(tables.Table):
    class Meta:
        attrs = {...}

class Child(Parent):
    class Meta(Parent.Meta):
         attrs = {'summary': 'A child table'}

name 'attrs' is not defined引发NameError name 'attrs' is not defined 。 然而,这似乎确实有效,但很丑陋:

class Child(Parent):
    class Meta(Parent.Meta):
        pass
     Meta.attrs['summary'] = 'A child table'

这个错误有解决方案吗? 上述解决方法对我不起作用。 http://stackoverflow.com/questions/21787938/inherit-and-modify-a-meta-class

我没有看到将两个任意class Meta合并在一起的明显算法。 想想为attrs添加一个键,从attrs删除一个键,用新的 dict 替换attrs等的情况。也许我错过了一些东西,但事实并非如此对我来说很明显你将如何以一种理智的方式做到这一点。

行为应该与您是models.Model类的子类相同。

我不确定我是否遵循你所说的。 我只是想从父类继承元并添加几列。 我已经更新了上面 SO 问题中的代码,希望这更有意义。

@bradleyayers——如果我正确理解你的请求,你应该能够按照这个 StackOverflow 帖子来覆盖 Meta

@pydolan是的,也请查看http://stackoverflow.com/questions/21787938/inherit-and-modify-a-meta-class以了解其他一些方法。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

mpasternak picture mpasternak  ·  9评论

blite picture blite  ·  3评论

foldedpaper picture foldedpaper  ·  6评论

wtfrank picture wtfrank  ·  32评论

brianmay picture brianmay  ·  6评论