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. 重置迁移(极端情况)
如果迁移文件混乱,可重置迁移:
- 删除
migrations目录下除__init__.py外的所有文件 - 清空数据库中
django_migrations表中对应emnosys应用的记录 - 重新生成并执行迁移:
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者Yuki
相关产品推荐
相关产品推荐

