Отправить только текущую страницу объекта в шаблон (django) - PullRequest
0 голосов
/ 22 октября 2019

Я учу Джанго из MDN. И я работал над locallibrary. Там у меня есть одна проблема. Я хочу отправлять только книги на странице автора, но не все книги, только книгу автора текущей страницы.

Если URL равен

/ author / 1

, то отправляется только книгаидентификатор автора 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 .

, поэтому я хочу отправить книгу authorid 2 на author / 2 . 3-я книга по автору / 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

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Вы используете DetailView, поэтому у вас уже есть текущий автор в контексте. Так что на самом деле нет причин делать что-либо в представлении - вы можете удалить свой метод get_context_data. Вместо этого вы можете следовать обратной связи в шаблоне:

{% for book in author.book_set.all %}
  {{ book.title }}
{% endfor %}
0 голосов
/ 22 октября 2019
Фильтр

отправит вам набор запросов, а не объекты, вам нужно получить объекты, соответствующие потребности, например, Book.objects.filter(author__exact=Author.id)[0] даст вам первый объект из набора запросов, поэтому вы получите объект изздесь.

...