如何通过render_foo与django-tables2传递一个slug ?
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)
库表|作者|图书数量||--------|------------|j·k·罗琳[6]|布兰登·桑德森| 12 ||赫尔曼·梅尔维尔| 5 |
点击作家赫尔曼·梅尔维尔(Herman Melville),它会向下钻取他的书
看起来,最简单的方法是使用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'来查询模型的其他部分。
注释后更新:
另外,你不需要在你的LibraryTableView中使用values。试一试:
queryset = Author.objects.annotate(book_count=Count('book'))
这将使您的作者作为具有get_absolute_url()方法的对象。你需要适当地更新你的LibraryTable类Meta:,因为它实际上是一个你正在使用的作者模型。