ValueError at /book/add Поле 'id' ожидало число, но получило 'add' --- django

На работающем сайте выводилась коллекция книг с отображением их содержимого. Но когда я добавляю функцию def addbook(request): она выдает мне такую проблему:

ValueError at /book/add Поле 'id' ожидало число, но получило 'add'.

enter image description here

в - all_book.html:

{% extends 'base.html' %}

    {% block content %}
          <h1>kljgf</h1>
          <a href ="{% url 'addbook' %}">Add Book</a>
          {% for book in books %}
            <h3>
              <a href = "{% url 'detail_book' book.id %}">{{book.namebook}}</a>
            </h3>
            <hr>
          {% endfor %}
    {% endblock content %}

в просмотрах:

def detail_book(request, id):
    boo = book.objects.get(id=id)
    context = {'book' : boo} 
    return render(request, 'detail_book.html',  context)

def addbook(request):
    book_form = book_form()
    context = {'form' : book_form}
    return render(request, 'add_book.html',  context)

в url:

  path('book/<id>', views.detail_book, name="detail_book"),
  path('book/add', views.addbook, name="addbook"),

в файле add_book.html

{% extends 'base.html' %}

{% block content %}
      <h1>add book </h1>
      <form method="POST">
          {% csrf_token %}
          {{form}}
      </form>
{% endblock content %}

Путь book/add неоднозначен - он разбирается как book/<id> с id = 'add'

Вам нужно либо изменить один из двух путей, чтобы устранить двусмысленность, либо поместить путь для book/add перед book/<id>, чтобы диспетчер URL сопоставил его первым.

Ваш urls.py будет искать совпадения с вашим URL сверху вниз, поэтому, когда вы нажмете /add, первым совпадением будет запрос ID, который ожидает числовой ID.

Измените порядок этих двух URL-путей так, чтобы сначала проверялось add, а ID только в том случае, если add не совпадает, это решит вашу проблему.

Это происходит потому, что вы не указали тип, поэтому django принимает 'add' за id.

Хотя это можно исправить, изменив порядок поиска определенных строк в первую очередь, более питоничным будет сделать различие явным. В urls.py добавьте 'int' к параметру переменной, как в docs

  path('book/<int:id>', views.detail_book, name="detail_book"),
  path('book/add', views.addbook, name="addbook"),

Теперь порядок не имеет значения, поскольку целые числа будут считаться идентификаторами, а нецелые могут быть другими представлениями.

Вернуться на верх