NoReverseMatch:未找到参数“(1,)”的 'complete' 的反向匹配。尝试了 1 种模式:['complete/<todo_id>']
NoReverseMatch: Reverse for 'complete' with arguments '(1,)' not found. 1 pattern(s) tried: ['complete/<todo_id>']
urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url('', views.index, name= 'index'),
url('add', views.addTodo, name ='add'),
url('complete/<todo_id>', views.completeTodo, name='complete'),
url('deletecomplete', views.deleteCompleted, name='deletecomplete'),
url('deleteall', views.deleteAll, name='deleteall')
]
views.py(程序的一部分)
def completeTodo(request, todo_id):
todo = Todo.objects.get(pk=todo_id)
todo.complete = True
todo.save()
return redirect('index')
index.html(部分程序)我想这就是问题所在。
<ul class="list-group t20">
{% for todo in todo_list %}
{% if todo.complete %}
<li class="list-group-item todo-completed">{{ todo.text }}</li>
{% else %}
<a href="{% url 'complete' todo.id %}"><li class="list-group-item">{{ todo.text }}</li></a>
{% endif %}
{% endfor %}
</ul>
你的正则表达式是错误的:
而不是这个:
url('complete/<todo_id>', views.completeTodo, name='complete'),
试试这个:
url(r'^complete/(?P<todo_id>\d+)$', views.completeTodo, name='complete'),
或者如果您想使用 path
path('complete/<int:todo_id>', views.completeTodo, name='complete'),
编辑
由于您使用的是 Django 1.*,因此您不能使用 path()
设置所有 URL 的正确方法是使用 url
正则表达式
备注
'^': The match must start at the beginning of the string or line.
'$': The match must occur at the end of the string
'\d+': Match all digits
The r
at the beginning stands for regex
url(r'^$', views.index, name= 'index'),
url(r'^add$', views.addTodo, name ='add'),
url(r'^complete/(?P<todo_id>\d+)$', views.completeTodo, name='complete'),
url(r'^deletecomplete$', views.deleteCompleted, name='deletecomplete'),
url(r'^deleteall$', views.deleteAll, name='deleteall')
好吧,你写了一个像这样的路径:
url('complete/<todo_id>/', views.completeTodo, name='complete'),
但是这里 <todo_id>
是 url 的一部分,它确实 而不是 表示变量等.这意味着只有一个 url 会匹配:/complete/<todo_id>
.
如果您使用 django-2.x,您可能想使用 path(..)
:
<b>path</b>('complete/<todo_id>', views.completeTodo, name='complete'),
此外,如果 todo_id
通常是整数,建议指定类型:
path('complete/<<b>int:</b>todo_id>', views.completeTodo, name='complete'),
对于django-1.x,你不能使用这样的path(..)
,那样的话你需要写一个正则表达式,比如:
<b>url</b>(<b>r</b>'<b>^</b>complete/<b>(?P</b><todo_id><b>[0-9]+)</b><b>$</b>', views.completeTodo, name='complete'),
我遇到了同样的问题,这是解决方案:
由于您的模型名称是 Todo(大写 T),您正在获取每个 Tudo 的 ID,但在视图、URL 和模板中,您写的是小 (t)。它变得区分大小写。
将视图 URL 和 HTML 模板中的名称 (todo_id) 更改为 (Todo_id)。
这里是:
urls.py
url('complete/<Todo_id>', views.completeTodo, name='complete'),
template.html
<a href="{% url 'complete' Todo.id %}">
views.py
def completeTodo(request, Todo_id):
todo = Todo.objects.get(pk=Todo_id)
urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url('', views.index, name= 'index'),
url('add', views.addTodo, name ='add'),
url('complete/<todo_id>', views.completeTodo, name='complete'),
url('deletecomplete', views.deleteCompleted, name='deletecomplete'),
url('deleteall', views.deleteAll, name='deleteall')
]
views.py(程序的一部分)
def completeTodo(request, todo_id):
todo = Todo.objects.get(pk=todo_id)
todo.complete = True
todo.save()
return redirect('index')
index.html(部分程序)我想这就是问题所在。
<ul class="list-group t20">
{% for todo in todo_list %}
{% if todo.complete %}
<li class="list-group-item todo-completed">{{ todo.text }}</li>
{% else %}
<a href="{% url 'complete' todo.id %}"><li class="list-group-item">{{ todo.text }}</li></a>
{% endif %}
{% endfor %}
</ul>
你的正则表达式是错误的:
而不是这个:
url('complete/<todo_id>', views.completeTodo, name='complete'),
试试这个:
url(r'^complete/(?P<todo_id>\d+)$', views.completeTodo, name='complete'),
或者如果您想使用 path
path('complete/<int:todo_id>', views.completeTodo, name='complete'),
编辑
由于您使用的是 Django 1.*,因此您不能使用 path()
设置所有 URL 的正确方法是使用 url
正则表达式
备注
'^': The match must start at the beginning of the string or line.
'$': The match must occur at the end of the string
'\d+': Match all digits
The
r
at the beginning stands forregex
url(r'^$', views.index, name= 'index'),
url(r'^add$', views.addTodo, name ='add'),
url(r'^complete/(?P<todo_id>\d+)$', views.completeTodo, name='complete'),
url(r'^deletecomplete$', views.deleteCompleted, name='deletecomplete'),
url(r'^deleteall$', views.deleteAll, name='deleteall')
好吧,你写了一个像这样的路径:
url('complete/<todo_id>/', views.completeTodo, name='complete'),
但是这里 <todo_id>
是 url 的一部分,它确实 而不是 表示变量等.这意味着只有一个 url 会匹配:/complete/<todo_id>
.
如果您使用 django-2.x,您可能想使用 path(..)
:
<b>path</b>('complete/<todo_id>', views.completeTodo, name='complete'),
此外,如果 todo_id
通常是整数,建议指定类型:
path('complete/<<b>int:</b>todo_id>', views.completeTodo, name='complete'),
对于django-1.x,你不能使用这样的path(..)
,那样的话你需要写一个正则表达式,比如:
<b>url</b>(<b>r</b>'<b>^</b>complete/<b>(?P</b><todo_id><b>[0-9]+)</b><b>$</b>', views.completeTodo, name='complete'),
我遇到了同样的问题,这是解决方案:
由于您的模型名称是 Todo(大写 T),您正在获取每个 Tudo 的 ID,但在视图、URL 和模板中,您写的是小 (t)。它变得区分大小写。
将视图 URL 和 HTML 模板中的名称 (todo_id) 更改为 (Todo_id)。
这里是:
urls.py
url('complete/<Todo_id>', views.completeTodo, name='complete'),
template.html
<a href="{% url 'complete' Todo.id %}">
views.py
def completeTodo(request, Todo_id):
todo = Todo.objects.get(pk=Todo_id)