【问题标题】:Django: Reverse for 'delete' with arguments '('',)' not found. 1 pattern(s) tried: ['$']Django:使用未找到参数“(”,)”的“删除”反向。尝试了 1 种模式:['$']
【发布时间】:2021-01-02 02:39:14
【问题描述】:

我是 Django 的新面孔,所以如果我的问题是愚蠢的,请考虑一下。在这种情况下,我想删除我的数据库中的一个项目,如果我点击按钮,html 会将一个 id 传递给views.py,然后函数Delete() 将删除这个项目。但无论我尝试了什么都没有任何反应。

现在我在home.html 中添加了action="{% url 'todolist:delete' todo.id %}",但它遇到了一些错误:NoReverseMatch: Reverse for 'delete' with arguments '('',)' not found. 1 pattern(s) tried: ['$'],我不知道如何解决它。所以请给我一些建议,我将非常感激。

我的代码如下:

项目/urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('todolist.urls', namespace='todolist')),
]

tod​​olist/urls.py:

app_name = "todolist"
urlpatterns = [
    path('', views.Add, name = 'add'),
    path('', views.Delete, name = 'delete'),
]

home.html:

<form action="{% url 'todolist:delete' todo.id %}" method="post">
{% csrf_token %}
<table>
  <tbody>
    {% for each in todo_list %}
    <tr>
        <td><div class="thing"><input type="checkbox" name="done" value="done"><label>{{each.todo}}</label></div></td>
        <td><input type="button" class="edit" name="edit" value="E"></td>
        <td><input type="button" class="delete" name="delete" value="x"></td>
    </tr>
    {% endfor %}
  </tbody>
</table>
</form>

views.py:

def Delete(request, id):
    if 'delete' in request.POST:
        todo = Todo.objects.get(id=id)
        todo.delete()
        todo_list = Todo.objects.all()
        return render(request, 'todolist/home.html', {'todo_list': todo_list, 'todo': todo})

【问题讨论】:

  • 你为什么不用DeleteView
  • @OsadhiVirochana 是的,显然他可以使用 DetailView。但是,目前(开始)我认为他不应该直接使用 DeleteView,因为他必须了解流程及其重要性。

标签: python django


【解决方案1】:

您的网址看起来不太好。如果你看这段代码:

urlpatterns = [
    path('', views.Add, name = 'add'),       
    path('', views.Delete, name = 'delete'),  <--- url path same as above 
]

但是,错误并非来自于此。它在谈论争论。所以:

urlpatterns = [
    path('add', views.Add, name = 'add'),       
    path('del/<str:id>', views.Delete, name = 'delete'),   
]

现在,您的 delete 路径将从以下位置获取参数:

<form action="{% url 'todolist:delete' todo.id %}" method="post">

Here你可以看到更多关于路径的信息。

【讨论】:

  • 我已听从您的建议,但错误仍然存​​在:NoReverseMatch: Reverse for 'delete' with arguments '('',)' not found. 1 pattern(s) tried: ['del/(?P&lt;id&gt;[^/]+)/$']
  • 试试:&lt;form action="{% url 'delete' todo.id %}" method="post"&gt;
  • 我试过&lt;form action="{% url 'delete' todo.id %}" method="post"&gt;,但是错误变成了Reverse for 'delete' not found. 'delete' is not a valid view function or pattern name....所以我不得不把它改成'todolist:delete'
  • 你确定你的路径不一样。
  • 是的。我已经将它们更改为 path('add/', views.add, name = 'add')path('del/&lt;int:id&gt;/', views.delete, name = 'delete') 就像你一样。
猜你喜欢
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2020-10-21
  • 2018-02-08
  • 2020-11-24
  • 1970-01-01
相关资源
最近更新 更多