Django网站无法拉取数据库数据,触发DoesNotExist错误
问题描述
管理员原本可通过后台修改网站标题、关键词及描述,但当前功能失效。访问网站时出现如下错误:
DoesNotExist at /
Setting matching query does not exist.
home/models.py
from django.db import models class Setting(models.Model): title = models.CharField(max_length=150) keywords = models.CharField(max_length=255) description = models.CharField(max_length=255) company = models.CharField(max_length=50) address = models.CharField(blank=True, max_length=150) phone = models.CharField(blank=True, max_length=15) fax = models.CharField(blank=True, max_length=15) email = models.CharField(blank=True, max_length=50) smptpserver = models.CharField(blank=True, max_length=30) smptemail = models.CharField(blank=True, max_length=30) smptpassword = models.CharField(blank=True, max_length=150) smptport = models.CharField(blank=True, max_length=15) icon = models.ImageField(blank=True, upload_to='images/') facebook = models.CharField(blank=True, max_length=50) instagram = models.CharField(blank=True, max_length=50) twitter = models.CharField(blank=True, max_length=50) aboutus = models.CharField(max_length=50) contact = models.CharField(max_length=50) contact_map = models.CharField(max_length=50) references = models.CharField(max_length=50) status = models.CharField(max_length=10, choices=STATUS) create_at = models.DateTimeField(auto_now_add=True) uptade_at = models.DateTimeField(auto_now=True) def __str__(self): return self.title
home/views.py
from django.http import HttpResponse from django.shortcuts import render from home.models import Setting def index(request): setting=Setting.objects.get(pk=1) context={'setting':setting} return render(request,'index.html',context)
home/temp/index.html
{% block title %} {{ setting.title }} {% endblock %} {% block keywords %} {{ setting.keywords }} {% endblock %} {% block description %} {{ setting.description }} {% endblock %}
问题原因及解决方法
核心原因
视图中通过Setting.objects.get(pk=1)强制获取主键为1的配置记录,但数据库中该记录不存在(可能被误删或从未创建),直接触发DoesNotExist异常。另外models.py中未定义STATUS枚举,也会导致创建记录失败。
解决步骤
补全数据库配置记录
- 若能访问后台管理:进入后台找到Setting模型,手动添加一条配置记录(确保主键为1,或后续修改视图逻辑不依赖固定主键)。
- 若无法通过后台添加,使用Django Shell创建:
执行命令进入shell:
输入以下代码创建记录(先补充models.py中的STATUS定义):python manage.py shellfrom home.models import Setting # 先在models.py中补充STATUS枚举(放在Setting类上方) # STATUS = (('active', '生效'), ('inactive', '失效')) Setting.objects.create( title="你的网站标题", keywords="网站关键词", description="网站描述", company="公司名称", aboutus="关于我们", contact="联系我们", contact_map="地图地址", references="参考链接", status="active" )
优化视图逻辑,避免硬编码主键
网站配置通常是单条记录,改用get_or_create自动处理记录不存在的情况,修改home/views.py:from django.shortcuts import render from home.models import Setting def index(request): # 获取或创建默认配置,防止记录缺失报错 setting, created = Setting.objects.get_or_create(pk=1, defaults={ 'title': '默认网站标题', 'keywords': '默认关键词', 'description': '默认描述', 'company': '默认公司', 'aboutus': '关于我们', 'contact': '联系我们', 'contact_map': '默认地图地址', 'references': '默认参考', 'status': 'active' }) context={'setting':setting} return render(request,'index.html',context)确保后台可管理配置
在home/admin.py中注册Setting模型,让管理员能在后台修改配置:from django.contrib import admin from .models import Setting admin.site.register(Setting)
内容的提问来源于stack exchange,提问作者user18587924
相关产品推荐
相关产品推荐

