ValueError at /book/add Поле 'id' ожидало число, но получило 'add' --- django
На работающем сайте выводилась коллекция книг с отображением их содержимого. Но когда я добавляю функцию def addbook(request): она выдает мне такую проблему:
ValueError at /book/add Поле 'id' ожидало число, но получило 'add'.
в - 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"),
Теперь порядок не имеет значения, поскольку целые числа будут считаться идентификаторами, а нецелые могут быть другими представлениями.