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

Django应急通知系统添加数据报错:emnosys_contact表无email列

Django应急通知系统添加联系人报错:emnosys_contact表不存在email列

我开发了一个Django应急通知系统,在尝试添加联系人数据时出现错误。报错信息显示django.db.utils.ProgrammingError:表emnosys_contact中不存在email列。我已经执行了数据库迁移操作,但问题仍然存在。


相关代码

views.py

from django.shortcuts import render, redirect
from django.views.generic import TemplateView
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
from .models import Contact


####################################################

class Main(TemplateView):
    template_name = 'emnosys/main.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['css_file'] = 'styles.css'
        return context

###################################################



def Registration(request):
    if request.method == "POST":
        username = request.POST['username']
        email = request.POST['email']
        password1 = request.POST['password1']

        myuser = User.objects.create_user(username, email, password1)
        myuser.save()

        return redirect('signin')
    return render(request, "emnosys/registration.html")

###############################################

def Signin(request):

    if request.method == 'POST':
        username = request.POST['username']
        password1 = request.POST['pass1']

        user = authenticate(username=username, password=password1)

        if user is not None:
            login(request, user)
            return render(request, "emnosys/main.html")
        else:
            return redirect('signin')
    return render(request, "emnosys/signin.html")

################################################

def Signout(request):
    logout(request)
    return redirect('home')

######################################################

class PersonalPage(TemplateView):
    template_name = 'emnosys/personalpage.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['css_file'] = 'styles.css'
        return context

####################################################


def add_contact(request):
    if request.method == 'POST':
        username = request.POST.get('about--username')
        message = request.POST.get('about--message')
        email = request.POST.get('about--email')
        Contact.objects.create(username=username, message=message, email=email)
    return render(request, 'emnosys/addcontacts.html')

models.py

from django.db import models
from django.core.validators import RegexValidator


class Contact(models.Model):
    username = models.CharField(max_length=255, null=False)
    message = models.TextField(max_length=999, null=False)
    email = models.EmailField(max_length=99, null=False)

addcontacts.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="../../static/emnosys/css/addcontacts.css">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="about">
        <div class="label">
            Add contact
        </div>
        <form action="" method="post">
        {% csrf_token %}
            <div class="username">
                <input name="about--username" id="about--username" placeholder=" " maxlength="40"></input>
                <label for="#about--username" id="username--label">Username for recipient (locally)</label>
            </div>
            <div class="textarea">
                <textarea name="about--textarea" id="about--textarea" cols="30" rows="10" placeholder=" " maxlength="999"></textarea>
                <label for="#about--textarea" id="textarea--label">Message</label>
            </div>
            <div class="telegram" id="telegram--label">
                <input name="about--email" id="about--email" placeholder=" " maxlength="40"></input>
                <label for="#about--email" id="email--label">Email of recipient (for example "qwerty@gmail.com")</label>
            </div>
            <button type="submit">Submit</button>
        </form>
    </div>
    <div class="waves">
        <img src="../../static/emnosys/images/waves.png" alt="">
    </div>
</body>
</html>

报错栈

Traceback (most recent call last):
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
     response = get_response(request)
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
     response = wrapped_callback(request, *callback_args, **callback_kwargs)
   File "D:\projects\EmNoSy\venv\emnosys_wqrfl\emnosys\views.py", line 81, in add_contact
     Contact.objects.create(username=username, message=message, email=email)
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
     return getattr(self.get_queryset(), name)(*args, **kwargs)
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\models\query.py", line 453, in create
     obj.save(force_insert=True, using=self.db)
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\models\base.py", line 740, in save
     force_update=force_update, update_fields=update_fields)
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\models\base.py", line 778, in save_base
     force_update, using, update_fields,
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\models\base.py", line 881, in _save_table
     results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\models\base.py", line 921, in _do_insert
     using=using, raw=raw,
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
     return getattr(self.get_queryset(), name)(*args, **kwargs)
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\models\query.py", line 1270, in _insert
     return query.get_compiler(using=using).execute_sql(returning_fields)
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\models\sql\compiler.py", line 1416, in execute_sql
     cursor.execute(sql, params)
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\backends\utils.py", line 98, in execute
     return super().execute(sql, params)
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\backends\utils.py", line 66, in execute
     return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\backends\utils.py", line 75, in _execute_with_wrappers
     return executor(sql, params, many, context)
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
     return self.cursor.execute(sql, params)
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\utils.py", line 90, in __exit__
     raise dj_exc_value.with_traceback(traceback) from exc_value
   File "D:\projects\EmNoSy\venv\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
     return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: ERROR: Column "email" in table "emnosys_contact" does not exist
LINE 1: ...RT INTO "emnosys_contact" ("username", "message", "email") V...
                                                              ^

解决方案

1. 重新生成并执行迁移

先确保迁移文件正确生成:

python manage.py makemigrations

检查migrations目录下新生成的文件,确认包含添加email字段的操作。然后执行迁移:

python manage.py migrate --run-syncdb

--run-syncdb参数会同步未被迁移记录的模型到数据库,解决迁移未生效的问题。

2. 验证数据库表结构

直接连接数据库,执行SQL查看表字段:

SELECT column_name FROM information_schema.columns WHERE table_name = 'emnosys_contact';

如果确实没有email列,可手动添加(优先用迁移,此为应急方案):

ALTER TABLE emnosys_contact ADD COLUMN email VARCHAR(99) NOT NULL;

3. 修复视图中表单字段匹配问题

注意到HTML中消息字段的name是about--textarea,但视图中用about--message获取,会导致message值为None,修正views.py中的add_contact函数:

def add_contact(request):
    if request.method == 'POST':
        username = request.POST.get('about--username')
        message = request.POST.get('about--textarea')  # 修正字段名匹配HTML表单
        email = request.POST.get('about--email')
        Contact.objects.create(username=username, message=message, email=email)
    return render(request, 'emnosys/addcontacts.html')

4. 重置迁移(极端情况)

如果迁移文件混乱,可重置迁移:

  1. 删除migrations目录下除__init__.py外的所有文件
  2. 清空数据库中django_migrations表中对应emnosys应用的记录
  3. 重新生成并执行迁移:
python manage.py makemigrations
python manage.py migrate

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:45:54