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

Django已创建模型实例但页面404:原因分析与解决方法

Django动态详情页404问题排查与修复

问题背景

开发Django应用时,尝试通过URL参数name创建动态视图展示Card模型实例详情,相关配置如下:

模型代码

class Card(models.Model):
    background_image_id = models.CharField(max_length=100)
    border_id = models.CharField(max_length=100)
    image = models.ImageField(upload_to='cards/')
    number = models.IntegerField()
    name = models.CharField(max_length=30)
    subtitle = models.CharField(max_length=100)
    title = models.CharField(max_length=200)
    card_paragraph1 = models.TextField()
    card_paragraph2 = models.TextField()
    card_paragraph3 = models.TextField()
    card_paragraph4 = models.TextField()
    card_button_class = models.CharField(max_length=100)
    card_detail_url = models.CharField(max_length=100, blank=True, null=True)
    card_modal_class = models.CharField(max_length=100)
    card_temple_url = models.CharField(max_length=100, blank=True, null=True)
    quote = models.CharField(max_length=255)
    background_modal_image_id = models.CharField(max_length=100)
    modal_title = models.CharField(max_length=100)

视图代码

from django.shortcuts import render
from .models import Card

def card(request, name):
    try:
        # 根据name获取对应卡片
        card = Card.objects.get(name=name)
    except Card.DoesNotExist:
        # 未找到则渲染占位页
        return render(request, 'cards2/temples_placeholder.html')
    else:
        # 找到则渲染详情页
        return render(request, 'cards2/card.html', {'card': card})

URL配置

from django.urls import path
from . import views

urlpatterns = [
    path('card/<str:name>/', views.card, name='card_detail'),
]

问题现象

访问http://127.0.0.1:8000/card/arepage/时触发404错误,提示页面未找到(arepage为已存在的Card实例name值)。

已确认:

  • 数据库中存在name='arepage'的Card实例;
  • URL模式已定义为匹配card/<str:name>/。

排查与修复方案

  • 检查项目根URL配置:确保应用的URL已被包含到项目根urls.py中,示例配置如下:

    from django.contrib import admin
    from django.urls import include, path
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include('your_app_name.urls')),  # 替换为你的应用名称
    ]
    

    若根URL未包含应用配置,请求将无法匹配到应用内的视图。

  • 验证URL匹配规则:

    • 确认请求URL末尾带有斜杠:Django默认APPEND_SLASH=True会自动补全斜杠,但如果服务器未开启重定向,无斜杠的URL会匹配失败;
    • 核对name参数的一致性:<str:name>会匹配除斜杠外的所有字符,注意数据库中name字段区分大小写,需确保URL参数与数据库值完全一致(无空格、拼写错误)。
  • 启用调试定位问题:

    • 开启settings.py中的DEBUG=True,访问404页面时,Django会列出所有已注册的URL模式,确认card/<str:name>/是否在列表中;
    • 在视图中添加打印语句,验证视图是否被调用、参数是否正确传递:
      def card(request, name):
          print(f"Received name: {name}")
          try:
              card = Card.objects.get(name=name)
              print(f"Found card: {card.name}")
          except Card.DoesNotExist:
              print(f"No card found for name: {name}")
              return render(request, 'cards2/temples_placeholder.html')
          else:
              return render(request, 'cards2/card.html', {'card': card})
      
      启动服务器后查看控制台输出,确认请求是否到达视图。
  • 验证模型查询准确性:在Django Shell中直接测试查询,确认实例是否存在:

    python manage.py shell
    

    执行:

    from your_app_name.models import Card
    Card.objects.get(name='arepage')
    

    若抛出DoesNotExist异常,说明数据库中实例的name存在拼写、大小写或空格差异,需核对数据库值。

  • 检查模板路径:确认cards2/card.html和cards2/temples_placeholder.html存在于应用的templates目录下,模板路径错误会导致渲染失败,但通常会抛出TemplateDoesNotExist异常而非404。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:52:43