【问题标题】:Django paginated master-detail in CBV DetailViewDjango 在 CBV DetailView 中分页主详细信息
【发布时间】:2017-03-08 01:08:56
【问题描述】:

我有以下型号:

class Book(models.Model):
    name = models.CharField()
    authors = models.ManyToManyField('Author', blank=True, verbose_name=_('authors'))

class Author(models.Model):
    name = models.CharField()
    
    def my_books(self) -> List[Book]:
        return Book.objects.filter(authors__exact=self.id).all()

我正在通过DetailView展示作者和相关书籍:

class AuthorDetailView(generic.DetailView):
    model = Author

在模板中,我通过author.my_books() 方法访问给定作者的书籍 - 但这会从数据库中提取所有行。

我想对书的行进行分页。

我如何做到这一点?

更新:根据this answer,我需要继承ListView 而不是DetailView,并覆盖get_queryset() 来获取书籍。有什么办法可以在 DetailView 中做到这一点?

【问题讨论】:

  • DetailView 中没有处理分页的代码。您当然可以将pagination toolsDetailView 一起使用,但Daniel 建议使用ListView 对我来说听起来更好。
  • 你是如何循环浏览模板文件中的书籍的?
  • 对不起。我的模板中有一些错误的代码导致所有书籍都被退回...... :(

标签: django pagination master-detail


【解决方案1】:

我相应地对ListView 进行了子类化。

网址路由:

url(r'^author/((?P<pk>\d+)/$', AuthorView.as_view(), name='author_detail'),

CBV:

class AuthorView(generic.ListView):
    model = Book
    paginate_by = 2

    def get_queryset(self):
        pk = int(self.kwargs['pk'])
        return Book.objects.filter(authors__id__exact=pk)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        pk = int(self.kwargs['pk'])
        author = get_object_or_404(Author, pk=pk)
        context['author'] = author
        return context

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-13
    • 2017-04-10
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多