用“”反转没有参数未找到。 Django (NoReverseMatchError
Reverse with " " no argument Not Found. Django (NoReverseMatchError
我是 django 的初学者。我对基于 class 的删除视图有疑问,因为它返回无反向匹配错误。我没有提供的 url 末尾有一个美元符号。
这是错误:
NoReverseMatch at /posts/myhome/
Reverse for 'delete_post' with no arguments not found. 1 pattern(s) tried: ['posts/(?P<slug>[^/]+)/delete$']
views.py
class DeletePostView(BSModalDeleteView, LoginRequiredMixin, UserPassesTestMixin):
model = Post
success_url = reverse_lazy('posts:myhome')
template_name = 'posts/delete_post.html'
def test_func(self):
post = self.get_object()
if self.request.user == post.user:
return True
return False
html代码:
<div class="content-section">
<form method="POST">
{% csrf_token %}
<div class="modal-body">
<fieldset class="form-group">
<legend class="border-bottom mb-4" style="text-align: center;">Delete Post</legend>
<h4 style="text-align: center;">Are you sure you want to delete this post?</h4>
</fieldset>
<div class="form-group" style="text-align: center;">
<button class="btn btn-sm btn-outline-danger" type="submit">Yes, Delete</button>
%}">Cancel</a> -->
</div>
</div>
</form>
</div>
urls.py
urlpatterns = [
path('myhome/', HomePostListView.as_view(), name='myhome'),
path('create/', CreatePostView.as_view(), name='create_post'),
path('<slug>/', views.detail_post, name='detail_post'),
path('<slug>/update', views.update_post, name='update_post'),
path('<slug>/delete', DeletePostView.as_view(), name='delete_post'),]
首先,欢迎您来到 SO!我也是这个平台的新手,所以我知道你来自哪里。我想提请注意 HTML 代码的格式,即 %}">Cancel</a> -->"
您在提交按钮下方的代码。我认为这不是这里的问题,但它可能被错误地复制粘贴了。
其次,理解 Django 的 url 模式正则表达式非常有帮助:Django Url Regex Table
图片来源:https://www.webforefront.com/django/regexpdjangourls.html
这有助于解释为什么错误输出在尝试反转的末尾显示美元符号,因为它标志着 reverse_lazy 使用的正则表达式模式的行尾。
你的问题的症结似乎源于你没有将参数传递给 delete_post 视图,因为它需要一个 slug。
Django 2.2 Docs为反向函数状态:
如果 URL 接受参数,你可以在 args 中传递它们。例如:
from django.urls import reverse
def myview(request):
return HttpResponseRedirect(reverse('arch-summary', args=[1945]))
您也可以传递 kwargs 而不是 args。例如:
>>> reverse('admin:app_list', kwargs={'app_label': 'auth'})
'/admin/auth/'
您需要将要删除的 post 的 slug 传递给该反向函数。
这不是因为这些代码,也不是因为 kwargs。 myhome.html 中的 javascript 有问题,我更改了,一切恢复正常。
感谢您的帮助!
我是 django 的初学者。我对基于 class 的删除视图有疑问,因为它返回无反向匹配错误。我没有提供的 url 末尾有一个美元符号。
这是错误:
NoReverseMatch at /posts/myhome/
Reverse for 'delete_post' with no arguments not found. 1 pattern(s) tried: ['posts/(?P<slug>[^/]+)/delete$']
views.py
class DeletePostView(BSModalDeleteView, LoginRequiredMixin, UserPassesTestMixin):
model = Post
success_url = reverse_lazy('posts:myhome')
template_name = 'posts/delete_post.html'
def test_func(self):
post = self.get_object()
if self.request.user == post.user:
return True
return False
html代码:
<div class="content-section">
<form method="POST">
{% csrf_token %}
<div class="modal-body">
<fieldset class="form-group">
<legend class="border-bottom mb-4" style="text-align: center;">Delete Post</legend>
<h4 style="text-align: center;">Are you sure you want to delete this post?</h4>
</fieldset>
<div class="form-group" style="text-align: center;">
<button class="btn btn-sm btn-outline-danger" type="submit">Yes, Delete</button>
%}">Cancel</a> -->
</div>
</div>
</form>
</div>
urls.py
urlpatterns = [
path('myhome/', HomePostListView.as_view(), name='myhome'),
path('create/', CreatePostView.as_view(), name='create_post'),
path('<slug>/', views.detail_post, name='detail_post'),
path('<slug>/update', views.update_post, name='update_post'),
path('<slug>/delete', DeletePostView.as_view(), name='delete_post'),]
首先,欢迎您来到 SO!我也是这个平台的新手,所以我知道你来自哪里。我想提请注意 HTML 代码的格式,即 %}">Cancel</a> -->"
您在提交按钮下方的代码。我认为这不是这里的问题,但它可能被错误地复制粘贴了。
其次,理解 Django 的 url 模式正则表达式非常有帮助:Django Url Regex Table 图片来源:https://www.webforefront.com/django/regexpdjangourls.html
这有助于解释为什么错误输出在尝试反转的末尾显示美元符号,因为它标志着 reverse_lazy 使用的正则表达式模式的行尾。
你的问题的症结似乎源于你没有将参数传递给 delete_post 视图,因为它需要一个 slug。
Django 2.2 Docs为反向函数状态: 如果 URL 接受参数,你可以在 args 中传递它们。例如:
from django.urls import reverse
def myview(request):
return HttpResponseRedirect(reverse('arch-summary', args=[1945]))
您也可以传递 kwargs 而不是 args。例如:
>>> reverse('admin:app_list', kwargs={'app_label': 'auth'})
'/admin/auth/'
您需要将要删除的 post 的 slug 传递给该反向函数。
这不是因为这些代码,也不是因为 kwargs。 myhome.html 中的 javascript 有问题,我更改了,一切恢复正常。
感谢您的帮助!