Как передать обратно Slug в Render_Foo в Django?
Как передать slug обратно через render_foo с django-tables2?
models.py
class Library(models.Model):
name = models.CharField(max_length=128)
library_slug = models.SlugField(unique=True)
class Author(models.Model):
library = models.ForeignKey(Library)
author_slug models.Slugfield(unqiue=True)
class Book(models.Model):
author = models.ForeignKey(Author)
book_slug = models.SlugField(unique=True)
views.py
def LibraryTableView(request):
queryset = books.objects.values('author','book').annotate(book_count=Count('book'))
table = LibraryTable(queryset)
def AuthorTableView(request, author_slug):
queryset = books.objects.filter(book__author__author_slug=author_slug)
table = AuthorTable(queryset)
tables.py
class LibraryTable(tables.Table):
class Meta:
model = Book
fields = ('author', 'book_count')
def render_book_count(self, value, author_slug):
return format_html('<a href="{}">{}</a>', author_slug, value)
Таблица библиотеки | Автор| Количество книг | |--------|------------| | Дж. К. Роулинг | 6 | | Брэндон Сандерсон | 12 | | Герман Мелвилл | 5 |
При нажатии на автора Германа Мелвилла, откроется список его книг
Title | Genre |
---|---|
Typee | Non-Fict |
Omoo | Fict |
Redburn | Fict |
Moby-Dick | Fict |
Timoleon | Poetry |
Примечание: Если я попробую author = tables.Column(linkify=True)
, я получу ошибку for linkify=True, Herman Mellville must have a method get_absolute_url
Судя по всему, самым простым способом будет использование linkify и добавление метода get_absolute_url.
class Author(models.Model):
library = models.ForeignKey(Library)
author_slug models.Slugfield(unqiue=True)
def get_absolute_url(self):
"""Returns a permalink for the author"""
return reverse(
"AuthorTableView",
kwargs={"author_slug": self.slug},
)
Преимущество такой настройки в том, что если вы измените структуру URL, она будет обновлена автоматически. Жесткое кодирование вашего HTML-формата href будет нарушено, если вы сделаете такое изменение.
Если, несмотря на это, вы все же хотите жестко закодировать его, то вам нужно убедиться, что ваш жестко закодированный URL заканчивается тем, что ожидает ваш url-файл для AuthorTableView. Например, если в вашем url-файле есть
'/author/<str:slug>'
тогда вам нужно
def render_book_count(self, value, record):
return format_html('<a href="/author/{}">{}</a>', record.slug, value)
Важное различие здесь в том, что 'value' - это значение столбца book_count, а record - это вся строка, которую вы можете опросить для других частей модели с помощью 'record.property'.