使用 django-tables2 将列与静态文本链接

Eug*_*zov 1 django django-tables2

LinkColumn我在新版本中找不到 的替代品django-tables2。作者声明LinkColumn已弃用且不应使用。但新linkify解决方案的文档记录很少,并且不具备旧版本的所有功能。例如我有这个专栏:

    edit = tables.LinkColumn(
        'wagtailadmin_pages:edit', args=[A('page.pk')],
        text='Edit'
    )
Run Code Online (Sandbox Code Playgroud)

它显示一个指向名为 的 wagtail 管理编辑页面的链接Edit。根本没有办法实现相同的使用,linkify因为只有在列上linkify有效的情况下才有效。accessor但访问器无法为所有行返回相同的静态文本(除非我修改模型以添加虚拟属性 - 但此特定模型位于第 3 方包中,无论如何它都会感觉像管道胶带解决方案)。

在所有其他情况下,列将不会显示链接。我研究了源代码,似乎 django-tables2 > 2.0.0 根本不支持这种情况。

是否有任何干净且易于理解的方法来使用静态链接文本构建链接列linkify

Eug*_*zov 5

回答我自己的问题。看来LinkColumnlinkify功能完全替代是不可能的。下面的代码解决了我的问题:

from django.urls import reverse
from django.utils.text import mark_safe

import django_tables2 as tables

from wagtail.core.models import PageRevision


class WagtailRevisionsTable(tables.Table):
    title = tables.Column(
        accessor='page.title',
        linkify=lambda record: record.page.url,
        verbose_name='Title'
    )
    edit = tables.Column(
        accessor='page.pk'
    )

    class Meta:
        model = PageRevision
        fields = ('title', 'created_at', 'user', 'edit')
        template_name = 'django_tables2/bootstrap-responsive.html'

    def render_edit(self, value):
        url = reverse('wagtailadmin_pages:edit', args=[value])
        return mark_safe(f'<a href="{url}">Edit</a>')
Run Code Online (Sandbox Code Playgroud)

旧的代码LinkColumn更加简洁,我不明白更改的原因,文档确实没有帮助。根本没有足够的信息linkifyrender_col方法。

所以我希望这个答案能帮助一些试图将旧代码移植到 django-tables2 >= 2.0 的可怜人。