如何添加自定义布尔字段的链接并使用Django_Tables2传递参数

时间:2018-02-19 19:59:38

标签: django django-tables2

所以我和Django_Tables2一起玩得很开心,而且我的一切都非常好用,这很棒。我的表使用我的数据库中的一系列列进行渲染,这些列是布尔值。这些列是“已完成”等列。我没有使用True和False,而是为我的布尔字段创建了一个自定义定义,它根据需要渲染glyphicons-ok和glyphicons-remove。见下面的代码

class BootstrapBooleanColumn(BooleanColumn):
    def __init__(self, null=False, **kwargs):
        if null:
            kwargs["empty_values"]=()
        super(BooleanColumn, self).__init__(**kwargs)

    def render(self, value):
        value = bool(value)
        html = "<span %s></span>"

        class_name = "glyphicon glyphicon-remove"
        if value:
            class_name = "glyphicon glyphicon-ok"
        attrs={'class': class_name}

        attrs.update(self.attrs.get('span', {}))

        return mark_safe(html % (AttributeDict(attrs).as_html()))

因此,我的列的编码如下:

completed = BootstrapBooleanColumn(attrs={'th':{'class':'centered nodec'}, 'td':{'data-title':'Completed'}})

但是现在我希望能够点击其中一个图标并相应地切换和更新我的数据库(即从False切换到True,反之亦然。)但我似乎无法能够传递参数,让我自己陷入困境。

我尝试将其包裹在一个锚

def render(self, value):
    value = bool(value)
    html = "<a href='/tasks/toggle/3'><span %s></span></a>"

触发我的网址,其硬编码ID为&#39; 3&#39;但我无法确定如何传递任何变量参数。也许我以错误的方式解决这个问题,所以如果有人能够指出正确的话,我会非常感激。

1 个答案:

答案 0 :(得分:0)

因此,经过多次拔毛,我设法提出了一个可行的解决方案。它可能不是最迷人的kludge,但对于我需要的,它的工作原理。我在这里发布它可以帮助其他任何人,如果有人想出更优雅的解决方案,那就太棒了。

怀疑我最初是在错误的树上吠叫。因此,我没有尝试子类化和修改内置的BooleanColumn,而是决定通过子类化和修改内置的LinkColumn从另一个角度来实现它。

下面是我作为类添加到tables.py文件中的代码。

class BoolLinkColumn(LinkColumn):
    def __init__(self, viewname=None, urlconf=None, args=None, kwargs=None, current_app=None, attrs=None, **extra):
        super(LinkColumn, self).__init__(attrs, **extra)
        self.viewname = viewname
        self.urlconf = urlconf
        self.args = args
        self.kwargs = kwargs
        self.current_app = current_app

    def render_link(self, uri, record, value, attrs=None):        
        value = bool(value)  
        column = self.args[1]
        html = "<a href='/tasks/toggle/"+str(record.pk)+"/"+str(column)+"/' %s></a>"
        class_name = "glyphicon glyphicon-remove"
        if value:
            class_name = "glyphicon glyphicon-ok"
        attrs={'class': class_name}       
        attrs.update(self.attrs.get('a', {}))  
        return mark_safe(html % (AttributeDict(attrs).as_html()))

在def render_link中,我获取了列的值和我在每列上指定的第二个参数。实际上,这是我点击的列的名称,但我无法找到动态获取列名的任何其他方法。

然后我使用列名和pk动态修改预编码的html字符串。我将变量通过我的urls.py文件传递给我的views.py文件。来回传递变量对我来说仍然有点困难,所以如果有人能告诉我更好的方法,那就太好了。

然后我将我的图标的默认值设置为false,然后测试我单击的列的值。如果值为true,我显然会根据需要更改图标。

最后,我更新了我的标签上的attrs,并返回完整的html字符串进行渲染。

现在我已经准备就绪并且正常工作,我可以在下面指定我的列。

class MyTable(ColumnShiftTable): 
    completed = BoolLinkColumn('my reverse url view', args=[A('pk'),'completed'], text='', empty_values=(), attrs={myattrs}

所以在一天结束时,这让我能做什么,为什么我要经历这一切?很简单,我使用django_tables2来渲染我的表,现在我已经在tables.py文件中使用了这个,我可以指定我选择有链接的任何布尔列。只要我在views.py文件中编写了适当的处理代码,我就可以在我的应用程序中显示一个列表,我可以直接从列表中更新(切换)布尔字段,而无需打开编辑窗口并调用记录从数据库等。这一切都在后台完成,然后屏幕刷新,非常酷。

与所有事情一样,可能有更好的方法来实现这一目标,但我无法在任何地方找到任何文档,所以这就是我提出的结果,而且我对结果非常满意。 : - )

快乐的编码!