我正在从MDN学习django。当时我正在本地图书馆工作。那里有一个问题。我只想发送作者页面上的书籍,而不是所有书籍,只发送当前页面的作者书籍。
如果网址为
然后仅发送了作者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
过滤器将向您发送查询集而不是对象,您需要做的是获取与需求相对应的对象,例如,Book.objects.filter(author__exact=Author.id)[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 %}
您正在使用DetailView,因此上下文中已经有当前作者。因此,实际上没有理由在视图中执行任何操作-您可以删除get_context_data
方法。相反,您可以按照模板中的反向关系进行操作:
{% for book in author.book_set.all %}
{{ book.title }}
{% endfor %}