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>
答案 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>
。
如果您使用django-2.x,则可能需要使用 path(..)
:
path('complete/<todo_id>', views.completeTodo, name='complete'),
此外,如果todo_id
通常是整数,建议指定类型:
path('complete/<int:todo_id>', views.completeTodo, name='complete'),
对于django-1.x,您无法使用此类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)