在django-tables2中向列中添加一个额外的变量

时间:2012-09-24 13:44:43

标签: django django-class-based-views django-tables2

尝试构建一个Django(1.4)网站,其中包含一些可以在弹出窗口中加载的页面。其中一些页面包含一个listview,在Django-tables2

中实现

当页面作为弹出窗口加载时,会添加额外的URL参数;例如 /backoffice/popup/articlegroups//backoffice/articlegroups/页面相同,但显示为弹出窗口。

我的问题是如何将这条额外的信息(弹出与否)添加到Django-tables2中的LinkColumns,因为编辑页面的链接也需要有这些信息。
Django-tables2有一个访问器,可用于访问查询集中的属性,但我需要在查询集之外添加一些额外的数据。我已经看到,向现有数据集添加额外数据充其量也很棘手,而且感觉不太干净。

我想知道是否有一种简单的方法可以将额外的数据添加到表或列类中,我也尝试过查看table.meta类,但无济于事。

我的代码如下:

TABLES.PY

class ArticlegroupTable(tables.Table):

    artg_name = LinkIfAuthorizedColumn(
        'ArticlegroupUpdate',
        args=["popup", A('pk')],
        edit_perm="articles.maintenance",
    )

这个方面有效,但它正在添加“popup”arugument作为固定字符串,你可以看到......

class ArticlegroupTable(tables.Table):

artg_name = LinkIfAuthorizedColumn(
    'ArticlegroupUpdate',
    args=[A('popup'), A('pk')],
    edit_perm="articles.maintenance",
)

有效,因为查询集中没有“popup”属性...

VIEWS.PY

    def get_context_data(self, ** kwargs):
    # get context data to be passed to the respective templates
    context = super(ArticlegroupSearch, self).get_context_data(**kwargs)
    data = self.get_queryset()
    table = ArticlegroupTable(data, self.request)
    RequestConfig(self.request, paginate={
        "per_page": 5,
        }).configure(table)
    context.update({'table': table})
    if 'popup' in self.kwargs:
        context.update({'popup': self.kwargs['popup']})
    return context

这似乎不是一个非常牵强的场景(向表2中的表/列添加URL参数),所以我想知道是否有人知道一种简单的方法。

谢谢,

埃里克

1 个答案:

答案 0 :(得分:2)

如果你正在快速破解,只需实施表格的__init__方法,并动态地将popup arg添加到LinkColumn

class ArticlegroupTable(tables.Table):
    def __init__(self, *args, **kwargs):
        if kwargs.pop("popup", False):
            for column in self.base_columns.values():
                if isinstance(column, tables.LinkColumn):
                    column.args.insert(0, "popup")
        super(Table, self).__init__(*args, **kwargs)

    # …

然后在你的视图中传递popup参数:

def get_context_data(self, ** kwargs):
    # get context data to be passed to the respective templates
    context = super(ArticlegroupSearch, self).get_context_data(**kwargs)
    data = self.get_queryset()
    popup = self.kwargs.get('popup')
    table = ArticlegroupTable(data, self.request, popup=popup)
    RequestConfig(self.request, paginate={
        "per_page": 5,
        }).configure(table)
    context.update({'table': table, 'popup': popup})
    return context