用“”反转没有参数未找到。 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 有问题,我更改了,一切恢复正常。

感谢您的帮助!