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>.

如果您使用 ,您可能想使用 path(..)

    <b>path</b>('complete/<todo_id>', views.completeTodo, name='complete'),

此外,如果 todo_id 通常是整数,建议指定类型:

    path('complete/<<b>int:</b>todo_id>', views.completeTodo, name='complete'),

对于,你不能使用这样的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)