【问题标题】:NoReverseMatch: Reverse for 'complete' with arguments '(1,)' not found. 1 pattern(s) tried: ['complete/<todo_id>']NoReverseMatch:未找到带有参数“(1,)”的“完整”的反向。尝试了 1 种模式:['complete/<todo_id>']
【发布时间】:2018-11-18 21:23:35
【问题描述】:

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>

【问题讨论】:

    标签: python django django-urls


    【解决方案1】:

    我也遇到了同样的问题,解决方法如下:

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

    【讨论】:

      【解决方案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 的正确方法是使用 url 正则表达式

      注意

      '^':匹配必须从字符串或行的开头开始。

      '$':匹配必须出现在字符串的末尾

      '\d+':匹配所有数字

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

      【讨论】:

      • 谢谢伙计。您能否也给我正确的正则表达式以用于其余网址。我是 Django 的新手。我使用 D 1.11.13。
      【解决方案3】:

      你写了这样的路径:

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

      但是这里&lt;todo_id&gt;url的一部分,它确实表示一个变量,等等。这意味着只有一个url可以匹配:@ 987654325@.

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

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

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

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

      对于,你不能使用这样的path(..)s,这种情况下你需要写一个正则表达式,比如:

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

      【讨论】:

      • 感谢您的帮助。我是 Django 的新手。我正在使用 Django 版本 1.11.13。我按照建议更正了表达式。我仍然无法添加、删除完成、删除所有(请给我正确的正则表达式)。
      • 好吧,因为我不知道相应的视图等,这是不可能的。但我您还需要在其中添加(?P&lt;todo_id&gt;[0-9]+)$
      • views.py 是否与我正在使用的 django 的正确版本相对应?我使用 1.11.13
      • @AdarshBahadur:如果您在每个正则表达式末尾添加 $ 并在前面添加 ^ 会怎样?
      • @AdarshBahadur:产生错误的模板标签是什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多