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

Django ViewSet中食谱编辑路由404问题及重定向实现咨询

解决Recipe编辑页面404错误的方案

问题根源

从Nginx日志可以看出,请求GET /recipes/1/edit被Nginx当作静态文件请求处理,后端完全没收到请求。这是因为Django REST Framework的ModelViewSet默认不会生成/recipes/<pk>/edit这个路由,该路由未被后端接管,导致Nginx尝试在静态文件目录中查找对应路径,最终返回404。

DRF ModelViewSet默认生成的路由为:

  • /recipes/:GET(列表)、POST(创建)
  • /recipes/<pk>/:GET(详情)、PUT(全量更新)、PATCH(部分更新)、DELETE(删除)

解决方案

方案1:修改前端按钮跳转地址(推荐)

直接将“update recipe”按钮的跳转目标从/recipes/<pk>/edit改为/recipes/<pk>/,或者调整为前端自身的编辑路由(比如前端单页应用的/recipes/edit/<pk>)。后端仅负责提供API接口,编辑页面的渲染由前端完成:

  • 前端通过GET请求/recipes/<pk>/获取食谱数据
  • 编辑完成后通过PATCH请求/recipes/<pk>/提交更新

方案2:后端添加重定向路由

如果无法修改前端代码,可在后端添加重定向逻辑,将/recipes/<pk>/edit的GET请求转发到正确的API地址。

方式A:在urls.py中直接添加重定向

在项目的主urls.py或recipes应用的urls.py中添加以下路由:

from django.shortcuts import redirect
from django.urls import re_path

urlpatterns = [
    # 其他路由配置...
    re_path(r'^recipes/(?P<pk>\d+)/edit/$', lambda request, pk: redirect(f'/recipes/{pk}/'), name='recipe-edit-redirect'),
]

方式B:在RecipeViewSet中添加自定义Action

在RecipeViewSet中注册自定义action来处理/recipes/<pk>/edit的GET请求:

from django.shortcuts import redirect
from rest_framework.decorators import action

class RecipeViewSet(viewsets.ModelViewSet):
    # 原有代码...

    @action(detail=True, methods=['get'], url_path='edit')
    def edit_redirect(self, request, pk=None):
        # 重定向到食谱详情/更新API地址
        return redirect(f'/recipes/{pk}/')
        # 也可以用reverse生成URL(需提前导入reverse)
        # from django.urls import reverse
        # return redirect(reverse('recipe-detail', kwargs={'pk': pk}))

添加后,DRF的路由注册器会自动生成/recipes/<pk>/edit的路由,将GET请求转发到该action,实现重定向。

为什么你之前的代码未生效

你之前编写的edit_redirect方法存在以下问题:

  1. 路由未注册:未通过@action装饰器将方法注册为ViewSet的可用action,导致DRF未生成对应路由
  2. URL判断逻辑错误:self.request.url是具体请求路径(如/recipes/1/edit),不会匹配'/<int:pk>/edit'这种路由模式
  3. 返回值错误:返回的是元组而非合法的HttpResponseRedirect对象,无法被Django正确处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:43:12