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

Django中add视图未渲染指定模板反而返回404页面的问题求助

Django中add视图未渲染指定模板反而返回404页面的问题求助

问题描述

我正在用Django开发一个Wiki项目,尝试通过add视图渲染add.html模板,但访问对应路径时却直接返回了404页面,其他视图功能都正常工作。想请教各位该如何解决这个问题?

以下是我的相关代码:

views.py

from django.shortcuts import render
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse
from django import forms
import re
from . import util


def index(request):
    return render(request, "encyclopedia/index.html", {
        "entries": util.list_entries()
    })

def detail(request, entry):
    # 根据标题查询是否存在对应条目
    if util.get_entry(entry):
        content = util.get_entry(entry)
        return render(request, "encyclopedia/details.html",
                      {
                          "title": entry,
                          "content": content
                      })
    else:
        return render(request, "encyclopedia/404.html", {
              'entry': entry
        })

def add(request):
    return render(request, "encyclopedia/add.html")

urls.py

from django.urls import path

from . import views

app_name = "wiki"
urlpatterns = [
    path("", views.index, name="index"),
    path("<str:entry>/", views.detail, name="entry"),
    path("add/", views.add, name="add"),
]

问题根源分析

这个问题的核心在于Django URL路由的匹配顺序规则:

Django会按照urlpatterns列表的顺序从上到下依次匹配请求路径,一旦找到第一个匹配的路由,就会立刻调用对应的视图函数,不再继续匹配后续路由。

在你的配置中,<str:entry>/这个动态路由被放在了add/精确路由的前面。当你访问/add/时,Django会先匹配到这个动态路由,把字符串add当作entry参数传递给detail视图。

而detail视图会检查是否存在名为add的Wiki条目,显然这个条目不存在,所以就触发了404页面的渲染,完全没有机会走到add视图的逻辑。


解决方案:调整路由顺序

只需要把精确匹配的add/路由移到动态路由的前面,让Django先匹配固定路径:

修改后的urls.py:

from django.urls import path

from . import views

app_name = "wiki"
urlpatterns = [
    path("", views.index, name="index"),
    # 精确匹配的路由放在前面,优先匹配
    path("add/", views.add, name="add"),
    # 动态路由放在最后,避免干扰固定路径的匹配
    path("<str:entry>/", views.detail, name="entry"),
]

验证与后续建议

  1. 重启Django服务器后,访问/add/路径,此时应该能正常渲染add.html模板了。
  2. 后续添加其他固定路径的路由(比如edit/、search/等)时,都要遵循精确路由在前,动态路由在后的原则,避免类似的路由冲突问题。
  3. 如果你担心动态路由会捕获到一些意外的路径,可以考虑给动态路由添加更严格的正则匹配规则,比如限制entry的字符范围,进一步降低冲突概率。

备注:内容来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:20:28