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参数与数据库值完全一致(无空格、拼写错误)。
- 确认请求URL末尾带有斜杠:Django默认
启用调试定位问题:
- 开启
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
相关产品推荐
相关产品推荐

