You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework返回Response时触发NoReverseMatch错误排查

问题原因分析

这个NoReverseMatch错误的核心原因是你的视图在处理POST请求后,触发了不必要的模板渲染,且渲染时缺少模板所需的target_user变量,导致模板中反向解析insta:profile URL时传入了空的username参数。

具体来说:

  • 你的ProfileListView设置了renderer_classes = [TemplateHTMLRenderer],这意味着所有返回的Response都会默认用模板渲染器处理。
  • 当POST方法处理完关注/取消关注逻辑后,你返回了Response({ 'follow_exist': ... }),但这个Response里没有传入模板profile_list.html所需的target_user变量。
  • 模板中的AJAX代码里有{% url 'insta:profile' username=target_user.username %},此时target_user不存在,target_user.username就变成了空字符串,反向解析URL时自然找不到匹配的路由(因为你的路由要求<username>是一个非空值)。
解决方案

最直接的修复方式是让POST请求返回纯JSON数据,避免触发模板渲染,这里有两种简单的实现方式:

方式一:改用JsonResponse返回数据

直接替换POST方法中的Response为Django原生的JsonResponse,这样就不会触发TemplateHTMLRenderer的模板渲染逻辑:

# views.py
from django.http import JsonResponse
# ... 其他导入保持不变

class ProfileListView(mixins.UpdateModelMixin, generics.GenericAPIView):
    # ... 原有属性保持不变

    def post(self, request, *args, **kwargs):
        followed_user = get_object_or_404(USER, username=kwargs.get('username'))
        if request.user.is_authenticated:
            follower_user = request.user
            if followed_user == follower_user:
                raise PermissionError('Unable to follow yourself')
            else:
                if follower_user in followed_user.followers.all():
                    followed_user.followers.remove(follower_user)
                    return JsonResponse({ 'follow_exist': False })
                else:
                    follower_user.follows.add(followed_user)
                    return JsonResponse({ 'follow_exist': True })
        else:
            return redirect('insta/login')

方式二:为POST请求指定JSON渲染器

如果你想保留DRF的Response对象,可以在POST方法返回时指定使用JSONRenderer,跳过模板渲染:

# views.py
from rest_framework.renderers import TemplateHTMLRenderer, JSONRenderer
# ... 其他导入保持不变

class ProfileListView(mixins.UpdateModelMixin, generics.GenericAPIView):
    renderer_classes = [TemplateHTMLRenderer, JSONRenderer]  # 添加JSONRenderer
    # ... 原有属性保持不变

    def post(self, request, *args, **kwargs):
        followed_user = get_object_or_404(USER, username=kwargs.get('username'))
        if request.user.is_authenticated:
            follower_user = request.user
            if followed_user == follower_user:
                raise PermissionError('Unable to follow yourself')
            else:
                if follower_user in followed_user.followers.all():
                    followed_user.followers.remove(follower_user)
                    return Response({ 'follow_exist': False }, renderer_classes=[JSONRenderer])
                else:
                    follower_user.follows.add(followed_user)
                    return Response({ 'follow_exist': True }, renderer_classes=[JSONRenderer])
        else:
            return redirect('insta/login')
额外检查

确保你的AJAX请求中的URL是正确渲染的——在GET请求返回的模板中,target_user是存在的,所以AJAX的URL应该能正确生成,这个问题主要出在POST请求返回后的模板渲染环节,上面的修复方案已经能解决这个问题。

内容的提问来源于stack exchange,提问作者mode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:04:55