一个工作网站带来了其内容显示的书籍集合,但当我添加一个函数**def addbook(request):**它给了我一个问题,这:
/book/add中的ValueError字段“id”应为数字,但得到的却是“add”。
在-- all_图书.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"),
在添加_书籍. html中
{% extends 'base.html' %}
{% block content %}
<h1>add book </h1>
<form method="POST">
{% csrf_token %}
{{form}}
</form>
{% endblock content %}
3条答案
按热度按时间rta7y2nd1#
路径
book/add
不明确-它被解析为book/<id>
,而id = 'add'
您需要更改两个路径中的一个以解决多义性,或者将
book/add
的路径放在book/<id>
之前,以便URL调度程序首先匹配它。gwbalxhn2#
您的urls.py将从上到下查找与您的URL匹配的项,因此当您单击/添加第一个匹配项时,它会找到需要数字ID的ID查询。
翻转这两个URL路径的顺序,使其首先检查add,只有当add不匹配时才检查ID,这样就可以解决您的问题。
mgdq6dx13#
这是因为你没有提供类型,所以django假设'add'是一个id。
虽然您可以通过更改顺序以首先查找已定义的字符串来解决此问题,但要使差异显式化可能会更加困难。在www.example.com中urls.py,将“int”添加到variable参数中,如文档中所述
现在顺序并不重要,因为整数将被假定为id,而非整数可以是其他视图。