【问题标题】:Link column with a static text using django-tables2使用 django-tables2 将列与静态文本链接
【发布时间】:2023-04-03 16:45:05
【问题描述】:

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

    edit = tables.LinkColumn(
        'wagtailadmin_pages:edit', args=[A('page.pk')],
        text='Edit'
    )

它会显示一个名为 Edit 的 wagtail 管理员编辑页面的链接。使用linkify 根本无法达到同样的效果,因为linkify 仅在您在列上有有效的accessor 时才有效。但是访问器不能为所有行返回相同的静态文本(除非我修改模型以添加一个虚拟属性 - 但是这个特定的模型在 3rd 方包中,无论如何它都会感觉像一个管道胶带解决方案)。

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

是否有任何简洁易懂的方式来使用linkify 构造带有静态链接文本的链接列?

【问题讨论】:

  • 您可以覆盖模型上的get_absolute_url 并传递linkify=True,也许,但这取决于模型。或者,您可以定义一个香草edit = tables.Column(...) 并在您的tables.Table 子类中创建一个render_edit
  • 我无法覆盖 get_absolute_url 或模型的任何其他属性,因为它来自 django-wagtail 包。感谢您建议覆盖 render_edit 方法 - 我非常专注于尝试使讨厌的 linkify 工作,以至于我完全忘记了尝试其他方法。

标签: django django-tables2


【解决方案1】:

回答我自己的问题。似乎不可能用linkify 功能完全替换LinkColumn。下面的代码解决了我的问题:

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>')

旧的LinkColumn 的代码更简洁,我不明白更改的原因,文档真的没有帮助。没有足够的关于 linkifyrender_col 方法的信息。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多