重定向视图中的 Django NoReverseMatch 错误

Posted

技术标签:

【中文标题】重定向视图中的 Django NoReverseMatch 错误【英文标题】:Django NoReverseMatch error in RedirectView 【发布时间】:2020-06-11 02:17:53 【问题描述】:

我一直在尝试为我的网站创建关注功能,但是我一直遇到错误。 这是 UserProfileInfo 模型

slug = models.SlugField(unique=True,allow_unicode=True)
# ... other fields

def get_absolute_url(self):
        kwargs = 
            'slug':self.user.username,
        
        return reverse('mainapp:view_profile_with_pk',kwargs=kwargs)
        # return reverse('mainapp:post_list')

    def save(self, *args, **kwargs):
        self.slug = slugify(self.user.username)
        super().save(*args, **kwargs)

这是我的看法

class AddFriendRedirect(RedirectView):
    def get_redirect_url(self,*args,**kwargs):
        slug = self.kwargs.get("slug")
        obj = get_object_or_404(UserProfileInfo,slug=slug)
        # user_profile = User.objects.get(username=username)
        url_ = obj.get_absolute_url()
        user = self.request.user
        if user.is_authenticated:
            if user in obj.friends.all():
                obj.friends.remove(user)
            else:
                obj.friends.add(user)
        return url_

这是我的urls.py

path('profile/<str:username>/',views.view_profile,name='view_profile_with_pk'), # this one is the profile one
path('profile/<str:slug>/add/',views.AddFriendRedirect.as_view(),name='add_friend'),

最后这是我的 html

<a id="new-post" href="% url 'mainapp:add_friend' slug=username %">
        <button id="">
            Connect
        </button>

这是我的错误

NoReverseMatch 在 /mainapp/profile/don0024/add/

未找到带有关键字参数“'slug': 'don0024'' 的“view_profile_with_pk”的反向操作。尝试了 1 种模式:['mainapp/profile/(?P[^/]+)/$']

以及完整的追溯

环境:

请求方法:GET 请求 URL: http://127.0.0.1:8000/mainapp/profile/don0024/add/

追溯:

文件 “C:\Users\User.virtualenvs\interests-site-Ho6yLlHE\lib\site-packages\django\core\handlers\exception.py” 在内部 34. response = get_response(request)

文件 “C:\Users\User.virtualenvs\interests-site-Ho6yLlHE\lib\site-packages\django\core\handlers\base.py” 在 _get_response 115. response = self.process_exception_by_middleware(e, request)

文件 “C:\Users\User.virtualenvs\interests-site-Ho6yLlHE\lib\site-packages\django\core\handlers\base.py” 在 _get_response 113. response = Wrapped_callback(request, *callback_args, **callback_kwargs)

文件 “C:\Users\User.virtualenvs\interests-site-Ho6yLlHE\lib\site-packages\django\views\generic\base.py” 在视野中 71. return self.dispatch(request, *args, **kwargs)

文件 “C:\Users\User.virtualenvs\interests-site-Ho6yLlHE\lib\site-packages\django\views\generic\base.py” 在调度中 97. return handler(request, *args, **kwargs)

文件 “C:\Users\User.virtualenvs\interests-site-Ho6yLlHE\lib\site-packages\django\views\generic\base.py” 在得到 188. url = self.get_redirect_url(*args, **kwargs)

文件“C:\Users\User\interests-site\interests\mainapp\views.py”在 get_redirect_url 227. url_ = obj.get_absolute_url()

文件“C:\Users\User\interests-site\interests\mainapp\models.py”在 get_absolute_url 72. return reverse('mainapp:view_profile_with_pk',kwargs=kwargs)

文件 “C:\Users\User.virtualenvs\interests-site-Ho6yLlHE\lib\site-packages\django\urls\base.py” 相反 90. return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))

文件 “C:\Users\User.virtualenvs\interests-site-Ho6yLlHE\lib\site-packages\django\urls\resolvers.py” 在 _reverse_with_prefix 673. raise NoReverseMatch(msg)

异常类型:NoReverseMatch at /mainapp/profile/don0024/add/ 异常值:使用关键字反转“view_profile_with_pk” 未找到参数''slug':'don0024''。尝试了 1 种模式: ['mainapp/profile/(?P[^/]+)/$']

如果有很多代码和错误,我很抱歉,但任何帮助都会很棒

【问题讨论】:

你也可以显示view_profile_with_pk 的网址吗? 用另一个网址添加了它 【参考方案1】:

您错误地将 kwargs 传递给 reverse 函数。这是将用户名传递到view_profile_with_pk url 的正确方法。

kwargs = 
    'username': self.user.username,

return reverse('mainapp:view_profile_with_pk',kwargs=kwargs)

【讨论】:

我这样做了,但是我现在收到一个 404 错误,提示该页面不存在 您能否检查view_profile 函数以确保正确渲染。还请提供完整的追溯。 你不会相信,但现在它可以正常工作,但它没有在数据库中更新。它重定向,然后就是这样。它不会将用户添加到 manytomanyfield 我不确定你的模型的关系和你的保存方法,所以我无法猜测。 啊抱歉我原来忘了做【参考方案2】:

您必须在get_absolute_url 中设置kwargs,如下所示...

kwargs = 
             'username':self.user.username,
         

因为您在 urls.py 中设置了 username,而不是 slug。

path('profile/<str:username>/',views.view_profile,name='view_profile_with_pk')
path('profile/<slug:slug>/add/',views.AddFriendRedirect.as_view(),name='add_friend'),

因此,当它尝试设置slug 时,它不会找到slug,因为您在您的网址中设置了&lt;str:username&gt;

【讨论】:

以上是关于重定向视图中的 Django NoReverseMatch 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义 django 404 错误视图重定向?

当表单操作设置为“。”时,Django 重定向到不同的视图。

django重定向导致重定向到下一页,但然后返回原始?

使用 Django 和 AllAuth 登录后不重定向到我自己的视图

Django:如何通过 AJAX 将 PKID 列表传递给下一个视图,然后重定向

如何在 Django 视图中检测重定向