Вообще, используйте class based veiws, то есть вьюхи, на основе классов. Здесь я приведу пример вывода списка книг (без наследования от ListView, чтобы лучше понимать, как это работает). Предположим, эти книги будут карточками в шаблоне и у каждой карточки есть кнопка для переходя к этой книге.
В классе модели нужно определить метод get_absolute_url. В конце ответа поймете, зачем он.
models.py
Посмотрите, что такое reverse в документации.
class Book(models.Model):
title = models.CharField(...)
...
def get_absolute_url(self):
return reverse("book-detail-page-url", args=[str(self.id)]
urls.py
Создаем урлы для списка книг и для конкретной книги с конкретным айди.
urlpatterns = [
path("books/", BooksListView().as_view(), name="books-page-url"),
path("book/<id>/", BookDetailView().as_view(), name="book-detail-page-url")
]
views.py
class BookListView(View):
def get(self, request):
books = Book.objects.all()
return render(request, "books.html", context={"books": books})
class BookDetailView(View):
def get(request, id):
book = Book.objects.filter(id=id)
return render(request, "book_detail.html", context={"book": book})
books.html
Чтобы по кнопке перейти к определенной книге, Джанга будет использовать тот самый метод get_absolute_url. Что делает этот метод вообще? Когда к нему обращаются он переносит пользователя на урл с именем "book-detail-page-url" то есть "book/id/". Этот самый айди мы передаем в этом же методе через args.
...
{% for book in books %}
{{ book.title }}
...
<a href="{{ book.get_absolute_url }}" class="btn btn-primary">Подробнее</a>
...
{% endfor %}
book_detail.html
...
{{ book.title }}
...