【问题标题】:Send Only Current Page object to the template (django)仅将当前页面对象发送到模板(django)
【发布时间】:2019-10-22 06:06:37
【问题描述】:

我正在从 MDN 学习 django。我正在研究 locallibrary。我遇到了一个问题。 我只想发送作者页面上的书籍,而不是所有书籍,只发送当前页面的作者书籍。

如果网址是

/作者/1

然后只发送作者 ID 为 1 的书,而不是全部

AuthorDetailView 中,我尝试了 context['books']=Book.objects.filter(author__exact=Author.id)。 但它给出了错误

**TypeError at /catalog/author/1**

**int() argument must be a string, a bytes-like object or a number, not 'DeferredAttribute'**

当我写 context['books']=Book.objects.filter(author__exact=1) 然后它只在所有页面上发送 authorid 1 的书。 关于作者/2

所以我想在 author/2 上发送 authorid 2 的书。 3 关于author/3 的书。 但并非所有书籍都在每一页上。

在需要的时候发送所有对象是没有意义的。

{% for book in books%}
    {% if author.id is book.author.id %}
      <li>
        <a href="{{ book.get_absolute_url }}">{{ book.title }}</a> ({{book.author}})
      </li>
{% endif %}

这段代码做我想做的事,但发送所有对象。 我希望你明白我想要什么。

这是我的模型,查看https://pastebin.com/yY6M5LUA

【问题讨论】:

  • 过滤Author.id 没有意义。哪个作者?
  • @DanielRoseman 是的,那个作者应该是当前页面的 pk,所以应该有 author__exact = pkOfAuthorOfCurrentPage 但我不知道如何在这个视图中获取当前页面的详细信息,我认为这很混乱跨度>
  • 您需要显示视图的其余部分和 URL。

标签: python django django-models detailsview


【解决方案1】:

filter 会给你一个查询集而不是一个对象,你需要做的是获取与需要对应的对象,例如,Book.objects.filter(author__exact=Author.id)[0] 会给你查询集中的第一个对象,所以你从在这里。

【讨论】:

  • 如果这是问题所在,那么传递常量1 是如何工作的?
【解决方案2】:

您正在使用 DetailView,因此您已经在上下文中拥有当前作者。所以实际上没有理由在视图中做任何事情 - 你可以删除你的 get_context_data 方法。相反,您可以遵循模板中的反向关系:

{% for book in author.book_set.all %}
  {{ book.title }}
{% endfor %}

【讨论】:

    猜你喜欢
    • 2018-02-18
    • 2014-05-25
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 2020-05-08
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多