仅将当前页面对象发送到模板(django)

问题描述 投票:0回答:3

我正在从MDN学习django。当时我正在本地图书馆工作。那里有一个问题。我只想发送作者页面上的书籍,而不是所有书籍,只发送当前页面的作者书籍。

如果网址为

/ author / 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的书。在author / 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

python django django-models detailsview
3个回答
0
投票

过滤器将向您发送查询集而不是对象,您需要做的是获取与需求相对应的对象,例如,Book.objects.filter(author__exact=Author.id)[0]将为您提供查询集的第一个对象,因此您可以从此处获取对象。


0
投票

您可以尝试这样:

例如。

首先获取作者对象,并且您的Book和Author模型之间可能具有ForeignKey关系,因此您可以通过以下方式获取该作者的书籍:

def author_detail(request,pk):
    author = AuthorModel.objects.get(pk=pk)
    books_of_author = BookModel.obejcts.filter(author=author) #filter(author_field_name=author)
    return render(request,'example.html',{'books_of_author':books_of_author'}

现在可以在模板中执行此操作:

{% for book in books_of author %}
   {{book.title}}
{% endfor %}

0
投票

您正在使用DetailView,因此上下文中已经有当前作者。因此,实际上没有理由在视图中执行任何操作-您可以删除get_context_data方法。相反,您可以按照模板中的反向关系进行操作:

{% for book in author.book_set.all %}
  {{ book.title }}
{% endfor %}
© www.soinside.com 2019 - 2024. All rights reserved.