/book/add中的值错误字段“id”需要一个数字,但得到的是“add”--- django

9rnv2umw  于 2023-01-21  发布在  Go
关注(0)|答案(3)|浏览(186)

一个工作网站带来了其内容显示的书籍集合,但当我添加一个函数**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 %}
rta7y2nd

rta7y2nd1#

路径book/add不明确-它被解析为book/<id>,而id = 'add'
您需要更改两个路径中的一个以解决多义性,或者将book/add的路径放在book/<id>之前,以便URL调度程序首先匹配它。

gwbalxhn

gwbalxhn2#

您的urls.py将从上到下查找与您的URL匹配的项,因此当您单击/添加第一个匹配项时,它会找到需要数字ID的ID查询。
翻转这两个URL路径的顺序,使其首先检查add,只有当add不匹配时才检查ID,这样就可以解决您的问题。

mgdq6dx1

mgdq6dx13#

这是因为你没有提供类型,所以django假设'add'是一个id。
虽然您可以通过更改顺序以首先查找已定义的字符串来解决此问题,但要使差异显式化可能会更加困难。在www.example.com中urls.py,将“int”添加到variable参数中,如文档中所述

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

现在顺序并不重要,因为整数将被假定为id,而非整数可以是其他视图。

相关问题