在 Django_tables2 列上使用 linkify 选项创建链接

Using linkify option on Django_tables2 columns to create links

我想在 Columns of the API Reference 中使用 linkify 添加一个 link 到我的列表视图。我在 Django_tables2 v 2.0.0b3

中使用 Django 2

我有一个带有两个上下文变量 name 的 URL,它是从 ListView 和 slug 字段传递过来的 species:

URL.py

app_name = 'main'

urlpatterns = [
#The list view
path('genus/<slug:name>/species/', views.SpeciesListView.as_view(), name='species_list'),
# The Detail view
path('genus/<name>/species/<slug:species>', views.SpeciesDetailView.as_view(), name='species'),
]

如果我手动输入 URL,则当前可以访问 DetailView。

我想使用可以输入带有 (viewname, args/kwargs) 的元组的选项。

对于 tables.py 我试过:

class SpeciesTable(tables.Table):
    species =tables.Column(linkify=('main:species', {'name': name,'slug':species}))

这给了一个 NameError: name 'species' is not defined.

species =tables.Column(linkify=('main:species', {'name': kwargs['name'],'slug':kwargs['species']}))

这给了一个 NameError: name 'kwargs' is not defined.

我还尝试将以下变量更改为字符串:

species =tables.Column(linkify=('main:species', {'name': 'name','slug':'species'}))
species =tables.Column(linkify=('main:species', {'name': 'name','slug':'object.species'}))

这些尝试得到了 NoReverseMatch Reverse for 'species' with keyword arguments '{'name': 'name', 'slug': 'species'}' not found. 1 pattern(s) tried: ['genus\/(?P<name>[^/]+)\/species\/(?P<species>[-a-zA-Z0-9_]+)$']

将其格式化为以下任一格式将得到 SyntaxError:

species =tables.Column(kwargs={'main:species','name': name,'slug':species})
species =tables.Column(args={'main:species','name': name,'slug':species})
species =tables.Column(kwargs:{'main:species','name': name,'slug':species})
species =tables.Column(args:{'main:species','name': name,'slug':species})

如何添加类似于 {% url "main:species" name=name species =object.species %} 的 link?目前文档中没有执行此操作的示例。

试着站在排的角度思考。在每一行中,table 需要 那行 的物种。 django-tables2 中使用的机制是访问器。它使您能够告诉 django-tables2 您希望它用于特定值的值。您不能为此使用变量(例如 namespecies,因为您希望从每条记录中检索它们。

因此使用访问器(通常缩写为 A),您的第一个示例如下所示:

class SpeciesTable(tables.Table):
    species = tables.Column(linkify=('main:species', {'name': tables.A('name'),'slug': tables.A('species')}))

Accessors 的概念可用于多个地方,也可用于更改要在列中呈现的值。

我建议在您的模型上定义 get_absolute_url 方法。这很好,因为通常当你想向模型显示一个 link 时,你有一个它的实例,所以在模板中它是 {{ species.get_absolute_url }} 的问题,对于 django 的 linkify 参数-tables2 列,您通常可以使用 linkify=True.

您对 linkify 上的文档的看法是正确的,它们确实需要改进。

linkify 参数的替代选项

经过多次尝试后,我始终无法使 linkify 参数选项按我想要的方式工作。但是,我确实找到了一种方法来实现相同的结果。

您可以添加一个render_foo函数。例如,如果你想呈现一个带有 link 的 ID,可以将 render_id 函数添加到他们的 table class 中。然后此函数将覆盖属性 ID 的现有呈现。

有关此的更多信息,请访问:https://django-tables2.readthedocs.io/en/latest/pages/custom-data.html

models.py

# models.py

import django_tables2 as tables
from django.urls import reverse


class Person:
   name = model.CharField(default='Jeffrey Lebowski', max_length=256)
   nick_name = model.CharField(default='the Dude', max_length=256)
   hates_hearing = model.CharField(default="Where's the money Lebowski?", max_length=256)


class PersonTable(tables.Table):
    class Meta:
        model = Person
        template_name = "django_tables2/bootstrap.html"
        fields("id", "name", "nick_name", "hates_hearing", )
   
    def render_id(self, record):
        """
        This function will render over the default id column. 
        By adding <a href> HTML formatting around the id number a link will be added, 
        thus acting the same as linkify. The record stands for the entire record
        for the row from the table data.
        """
        return format_html('<a href="{}">{}</a>',
                           reverse('example-view-name',
                           kwargs={'id':, record.id}),
                           record.id)
   

为此,还需要指定视图、url 和模板。

views.py

# views.py

from django_tables2 import SingleTableView

class ExampleTableView(SingleTableView):
    model = Person
    table_class = PersonTable
    template_name = "app_name/example.html"
    object_list = Person.objects.all()

urls.py

# urls.py

from django.urls import path
from . import views


urlpatterns = [
    path('<int:id>', views.detail, name="example-view-name"),
]

example.html

# templates/app_name/example.html

{% load static %}

<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title>EXAMPLE HTML</title>
</head>
<body>
   <section>
       <div>
           <h1>EXAMPLE TABLE</h1>
           <p>Here one can find the result of the django-tables2 output</p>
           {% render_table table %}
       </div>
   </section>
</body>
<footer>
    <p>That's it.</p>
</footer>
</html>

请注意,必须将 django-tables2 添加到已安装的应用程序列表中。否则模板不工作。

也许这是一个不错的选择。如果有人有任何意见或改进,请告诉我。