Использование опции linkify для столбцов Django_tables2 для создания ссылок - PullRequest
0 голосов
/ 02 сентября 2018

Я хочу добавить ссылку на мой просмотр списка, используя linkify в Столбцах Справочника по API . Я использую Django 2 с Django_tables2 v 2.0.0b3

У меня есть URL с двумя переменными контекста name, который передается из 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'),
]

DetailView в настоящее время доступен, если я вручную наберу URL.

Я хочу использовать опцию, в которой я могу ввести кортеж с помощью (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 %}? В настоящее время в документации нет примеров для этого.

1 Ответ

0 голосов
/ 02 сентября 2018

Попытайтесь думать с точки зрения ряда. В каждой строке таблице требуется вид этой строки . Механизм, используемый в 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 на ваших моделях. Это хорошо, потому что обычно, когда вы хотите показать ссылку на модель, у вас есть ее экземпляр, поэтому в шаблонах это вопрос {{ species.get_absolute_url }}, для аргумента linkify для столбцов django-tables2 вы в основном можете получить прочь с linkify=True.

Вы правы по поводу документов по linkify, они, безусловно, нуждаются в улучшении.

...