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

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枚举,也会导致创建记录失败。

解决步骤

  1. 补全数据库配置记录

    • 若能访问后台管理:进入后台找到Setting模型,手动添加一条配置记录(确保主键为1,或后续修改视图逻辑不依赖固定主键)。
    • 若无法通过后台添加,使用Django Shell创建:
      执行命令进入shell:
      python manage.py shell
      
      输入以下代码创建记录(先补充models.py中的STATUS定义):
      from 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"
      )
      
  2. 优化视图逻辑,避免硬编码主键
    网站配置通常是单条记录,改用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)
    
  3. 确保后台可管理配置
    在home/admin.py中注册Setting模型,让管理员能在后台修改配置:

    from django.contrib import admin
    from .models import Setting
    
    admin.site.register(Setting)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:25:21