如何在Django中传递回Slug到Render_Foo ?



如何通过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),它会向下钻取他的书

<表类>标题类型tbody><<tr>泰比Non-Fict参考福清雷德本福清《白鲸》福清Timoleon诗

看起来,最简单的方法是使用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:,因为它实际上是一个你正在使用的作者模型。

最新更新