Проблема при выполнении поиска с несколькими результатами. NoReverseMatch

Я делаю веб-приложение, которое использует API OpenLibrary, используя Django. В нем я выполняю поиск в API, если в результатах отображается более одной книги, я получаю такую ошибку:

NoReverseMatch at /search-results/

Отзыв для 'book_detail' с аргументами '('reina-roja-red-queen', 'Reina Roja / Red Queen')' не найден. Проверено 1 шаблон(ов): ['books/((?P[-a-zA-Z0-9_]+)/(?P[^/]+)+)']</p> </blockquote> <p> Мои файлы выглядят следующим образом:</p> <p>urls.py</p> <pre><code>from django.urls import path from . import views urlpatterns = [ path("", views.index, name="index"), path("search-results/", views.search_results, name="search_results"), path("books/<slug:slug>/<str:title>", views.book_detail, name="book_detail"), ] </code></pre> <p>views.py</p> <pre><code>from django.shortcuts import render, get_object_or_404, redirect from django.utils.text import slugify from books.api_library import search_book_by_author, search_book_by_title from .models import Book import requests import json def index(request): """ Index page """ if request.method == "POST": type_search = request.POST.get("type_search") search = request.POST.get("search") if type_search == "title": books_data = search_book_by_title(search).get("docs", []) elif type_search == "author": books_data = search_book_by_author(search).get("docs", []) if not books_data: books_data = [] request.session['search_results'] = books_data return redirect('search_results') return render(request, "books/index.html") def search_results(request): """ View to display search results """ search_results = request.session.get('search_results', []) books = [] for book in search_results: slug = slugify(book.get("title", "")) book_info = { "title": book.get("title", ""), "author": book.get("author_name", ""), "isbn": book.get("isbn", ""), "cover": book.get("cover", ""), "publisher": book.get("publisher", ""), "cover_url": f"https://covers.openlibrary.org/b/id/{book.get('cover_i', '')}-S.jpg", "description": book.get("description", ""), "publish_date": book.get("publish_date", ""), "slug": slug } books.append(book_info) return render(request, "books/search_results.html", {"books": books}) def book_detail(request, slug, title): """ Detail page """ print(title) url = f"https://openlibrary.org/search.json?title={title}" response = requests.get(url) book_data = response.json() print(book_data) for book in book_data: context = { "title": book.get("title", ""), "author": book.get("author_name", ""), "isbn": book.get("isbn", ""), "cover": book.get("cover", ""), "publisher": book.get("publisher", ""), "cover_url": f"https://covers.openlibrary.org/b/id/{book.get('cover_i', '')}-L.jpg", "description": book.get("description", ""), "publish_date": book.get("publish_date", ""), } return render(request, "books/book_detail.html", context) </code></pre> <p>index.html</p> <pre class="lang-html prettyprint-override"><code>{% extends "base.html" %} {% block content %} <form method="post"> {% csrf_token %} <article class="main__article search"> <fieldset class="search__fieldset"> <p class="search__p"> <label for="search" class="search__label">Search</label> <select name="type_search" id="type_search"> <option value="title">Title</option> <option value="author">Author</option> </select> <input type="text" name="search" id="search" class="search__input"> <button type="submit" class="search__button">Search</button> </p> </article> </form> <br> <article class="card"> {% for book in books %} <figure class="card__figure"> <img src="{{ book.cover_url }}" class="card__img", alt="{{ book.title }}", height="200", width="200"> </figure> <div class="card__div"> <h2 class="card__h2">{{ book.title }}</h2> <p class="card__p">Author: {{ book.author }}</p> <p class="card__p">Publish date: {{ book.publish_date }}</p> <p class="card__p">Publisher: {{ book.publisher }}</p> <a href="{% url 'book_detail' book.slug book.isbn %}" class="card__a" title="{{ book.title }}'}">View More</a> </div> {% endfor %} </article> {% endblock %} </code></pre> <p>search_results.html</p> <pre class="lang-html prettyprint-override"><code>{% extends "base.html" %} {% block content %} <h1>Search Results</h1> {% if books %} <ul> {% for book in books %} <li> <a href="{% url 'book_detail' book.slug book.title %}">{{ book.title }}</a> by {{ book.author }} </li> {% endfor %} </ul> {% else %} <p>No results found.</p> {% endif %} {% endblock %} </code></pre> <p>book_detail.html</p> <pre class="lang-html prettyprint-override"><code>{% extends "base.html" %} {% block content %} <article class="book-details"> <h1>{{ title }}</h1> <p><strong>Author(s):</strong> {{ author }}</p> {% if cover_url %} <img src="{{ cover_url }}" alt="Book Cover"> {% endif %} <p><strong>Description:</strong> {{ description }}</p> <!-- Otros detalles del libro que desees mostrar --> </article> {% endblock %} </code></pre> <p> Я хочу, чтобы мне показывали все результаты и я мог выбрать книгу и посмотреть в book_detail.html данные о ней.</p> <div class="index"> <div class="index__ad"> <!-- Yandex.RTB R-A-395615-4 --> <div id="yandex_rtb_R-A-395615-4" class="ads__text"> <div class="ads__text__content"></div> </div> <script>window.yaContextCb.push(()=>{ Ya.Context.AdvManager.render({ renderTo: 'yandex_rtb_R-A-395615-4', blockId: 'R-A-395615-4', }) })</script> </div> </div> <div class="df-feeds__entry__answer"> <p>Ваш второй параметр содержит косую черту, <code><str:…></code> этого не позволяет <code><path:…></code>, следует использовать конвертер путей:</p> <pre><code>path('books/<slug:slug>/<b><path:title></b>', views.book_detail, name='book_detail'),</code></pre> <p> При этом вы передаете заголовок с пробелами, косыми чертами и т. д. Это часто не очень хорошая идея, особенно в отношении <em> оптимизации поисковых систем (SEO)</em>.</p> </div> <a href="#top" class="backtotop"><i class="icon icon-chevron-up"></i> Вернуться на верх</a> </div> </div> <div class="main__sidebar"> <div role="sidebar"> <div class="main__sidebar__item"> <h4>Последние вопросы и ответы</h4> <p><a href="/qa/449445/">Multiple Data Entry in Django ORM</a></p> <p><a href="/qa/449444/">session.get works locally but not on server/local server</a></p> <p><a href="/qa/449443/">Failed to create subscription: LinkedIn Developer API real-time notification error</a></p> <p><a href="/qa/449442/">Does anyone have any idea about in-project PostgreSQL database? [closed]</a></p> <p><a href="/qa/449441/">Building development image with Nodejs and production without NodeJS (with only precompiled files)</a></p> <p><a href="/qa/449439/">dj-rest-auth + allauth not sending email</a></p> <p><a href="/qa/449440/">Celery task called inside another task always goes to default queue even with queue specified</a></p> <p><a href="/qa/449438/">Django + SimpleJWT: Access tokens sometimes expire immediately ("credentials not provided") when calling multiple endpoints</a></p> <p><a href="/qa/449437/">"Django: Cannot use ImageField because Pillow is not installed (Python 3.13, Windows)</a></p> <p><a href="/qa/449436/">How to write a documentation for project/django-project?</a></p> </div> <div class="main__sidebar__ad"> <!-- Yandex.RTB R-A-395615-3 --> <div id="yandex_rtb_R-A-395615-3" class="ads__sidebar"> <div style="height: 42vh;"></div> </div> <script>window.yaContextCb.push(()=>{ Ya.Context.AdvManager.render({ renderTo: 'yandex_rtb_R-A-395615-3', blockId: 'R-A-395615-3' }) })</script> </div> <div class="main__sidebar__item"> <h4>Рекомендуемые записи по теме</h4> <p><a href="/articles/tutorials/how-to-set-up-a-django-admin-site/">Как настроить сайт администратора Django</a></p> <p><a href="/articles/tutorials/how-to-set-up-github-oauth-in-a-django-app-for-user-authentication/">Как настроить GitHub OAuth в приложении Django для аутентификации пользователей</a></p> <p><a href="/articles/tutorials/get-started-with-django-build-a-portfolio-app/">Начало работы с Django: создание приложения-портфолио</a></p> <p><a href="/articles/tutorials/build-a-personal-diary-with-django-and-python/">Создайте личный дневник с помощью Django и Python</a></p> <p><a href="/articles/tutorials/primer-on-jinja-templating/">Учебник по шаблонизации Jinja</a></p> <p><a href="/articles/tutorials/nachalo-raboty-s-upravleniem-polzovatelyami-django/">Начало работы с управлением пользователями Django</a></p> <p><a href="/articles/tutorials/build-a-blog-using-django-graphql-and-vue/">Создайте блог с использованием Django, GraphQL и Vue</a></p> <p><a href="/articles/tutorials/how-to-render-markdown-in-a-django-application/">Как отобразить Markdown в приложении Django</a></p> <p><a href="/articles/tutorials/build-a-blog-from-scratch-with-django/">Создайте блог с нуля с помощью Django</a></p> <p><a href="/articles/tutorials/asynchronous-tasks-with-django-and-celery/">Асинхронные задачи с Django и Celery</a></p> </div> </div> </div> </div> </div> <footer class="footer"> <div class="footer__top"> <div class="footer__top__content"> <div class="footer__top__content__column"> <h4>Документация</h4> <a href="/docs/django/stable/" class="footer__top__content__column__item"> <h6>Django - документация на русском</h6> <p>Django (Джанго) — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC. Документация на русском языке.</p> </a> <a href="/docs/python/stable/" class="footer__top__content__column__item"> <h6>Python - документация на русском</h6> <p>Python — это простой в освоении мощный язык программирования.</p> </a> <a href="/docs/django-orm-cookbook/stable/" class="footer__top__content__column__item"> <h6>Рецепты Django ORM</h6> <p>Рецепты Django ORM - это книга о работе с моделями Django ORM и Django. Django ORM является одним из ключевых столпов Django.</p> </a> <a href="/docs/django-rest-framework/stable/" class="footer__top__content__column__item"> <h6>Django Rest Framework</h6> <p>Django Rest Framework (DRF) — это библиотека, которая работает со стандартными моделями Django для создания гибкого и мощного API для проекта.</p> </a> <a href="/docs/sqlalchemy/stable/" class="footer__top__content__column__item"> <h6>SQLAlchemy на русском</h6> <p>SQLAlchemy — это набор инструментов Python SQL и Object Relational Mapper, который дает разработчикам приложений всю мощь и гибкость SQL.</p> </a> <a href="/docs/django-cms/stable/" class="footer__top__content__column__item"> <h6>Django CMS</h6> <p>Django CMS - это современная платформа для веб-публикаций, построенная на Django, фреймворке веб-приложений «для перфекционистов с соблюдением сроков».</p> </a> <a href="/docs/social-docs/stable/" class="footer__top__content__column__item"> <h6>Документация по Python Social Auth</h6> <p>Python Social Auth - это простой в настройке механизм социальной аутентификации/регистрации с поддержкой нескольких платформ и провайдеров аутентификации.</p> </a> <a href="/docs/celery/stable/" class="footer__top__content__column__item"> <h6>Celery</h6> <p>Очереди задач используются как механизм распределения работы между потоками или машинами. Входом очереди задач является единица работы, называемая задачей.</p> </a> <a href="/docs/" class="footer__top__content__column__item"> <h6>Перейти к полному списку библиотек →</h6> <p></p> </a> </div> <div class="footer__top__content__column"> <h4>Статьи</h4> <a href="/articles/tutorials/" class="footer__top__content__column__item"> <h6>Статьи</h6> <p>Учебники по фреймворку Django, его особенностям, случаям использования и общим полезным вещам о фреймворке.</p> </a> <a href="/articles/tips/" class="footer__top__content__column__item"> <h6>Советы</h6> <p>Различные маленькие подсказки, советы, необычные применения Django - маленькие полезные вещи.</p> </a> <a href="/articles/videos/" class="footer__top__content__column__item"> <h6>Видеоуроки</h6> <p>Видеоуроки по фреймворку Django, основам и использованию Python и Django.</p> </a> <a href="/articles/news/" class="footer__top__content__column__item"> <h6>Новости</h6> <p>Новости Django. Будьте в курсе последних изменений и событий.</p> </a> <a href="/articles/python/" class="footer__top__content__column__item"> <h6>Python</h6> <p>Учебники по Python, его функциям, применению и общим полезным вещам.</p> </a> </div> </div> </div> <div class="footer__bottom"> <div class="footer__bottom__content"> <p>© <a href="https://django.fun/">Django.Fun</a> 2017-2025</p> <p class="footer__disclaimer">Django.Fun не связан с Django Software Foundation. Django - зарегистрированная торговая марка Django Software Foundation.</p> </div> </div> </footer> <div id="version-switcher"> </div> <script src="/static/CACHE/js/output.9d9e6a0d5c41.js"></script> <!-- Yandex.Metrika counter --> <script type="text/javascript" > (function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter46974723 = new Ya.Metrika({ id:46974723, clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true }); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = "https://mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks"); </script> <noscript><div><img src="https://mc.yandex.ru/watch/46974723" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> </body> </html>