NoReverseMatch:反向'完成',找不到参数'(1,)'。尝试了1种模式:['complete / <todo_id>']

时间:2018-06-08 19:07:45

标签: python django django-urls

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>

3 个答案:

答案 0 :(得分:2)

你的正则表达式是错误的:

而不是:

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正则表达式

注意

  

&#39; ^&#39;:匹配必须从字符串或行的开头开始。

     

&#39; $&#39;:匹配必须出现在字符串的末尾

     

&#39; \ d +&#39;:匹配所有数字

     

开头的r代表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')

答案 1 :(得分:2)

你写了一条路:

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

但此处<todo_id>网址的一部分,表示变量等,这意味着只有一个网址会匹配:/complete/<todo_id>

如果您使用,则可能需要使用 path(..)

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

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

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

对于,您无法使用此类path(..),在这种情况下,您需要编写正则表达式,例如:

    url(r'^complete/(?P<todo_id>[0-9]+)$', views.completeTodo, name='complete'),

答案 2 :(得分:0)

我遇到了同样的问题,这是解决方法:

由于您的模型名称是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)