在 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 您希望它用于特定值的值。您不能为此使用变量(例如 name
和 species
,因为您希望从每条记录中检索它们。
因此使用访问器(通常缩写为 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 添加到已安装的应用程序列表中。否则模板不工作。
也许这是一个不错的选择。如果有人有任何意见或改进,请告诉我。
我想在 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 您希望它用于特定值的值。您不能为此使用变量(例如 name
和 species
,因为您希望从每条记录中检索它们。
因此使用访问器(通常缩写为 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 添加到已安装的应用程序列表中。否则模板不工作。
也许这是一个不错的选择。如果有人有任何意见或改进,请告诉我。