Django中Model与ModelForm连接报错及代码排查求助
Django请求表单开发问题排查与修复
问题描述
学习Django并使用MySQL开发请求表单时,关联models.py与forms.py创建ModelForm出现错误。执行python manage.py makemigrations时触发报错:
formsite.models.Request_Form.DoesNotExist: Request_Form matching query does not exist
推测问题源于Request_Form.objects.get(pk=1)语句,同时需要排查代码中其他潜在问题。
项目相关代码
models.py
from django.db import models class Request_Form (models.Model): No_Permintaan = models.IntegerField(primary_key=True) Nama_Aplikasi = models.CharField(max_length=30) Departemen = models.CharField(max_length=50) Description = models.TextField(max_length=2000) TanggalReq = models.DateTimeField # 缺少括号 Nama_Atasan = models.CharField(max_length=30, unique=True) def __str__(self): return self.Nama_Aplikasi class Serah_Terima (models.Model): Kode_Permintaan = models.ForeignKey(Request_Form, on_delete=models.CASCADE) TanggalApproval = models.DateField # 缺少括号 Atasan = models.ForeignKey(Request_Form, on_delete=models.CASCADE,to_field='Nama_Atasan' ,related_name='Kode_Permintaan') # related_name重复 Comment = models.TextField # 缺少括号 def __str__(self): return self.name # 不存在name字段
forms.py
from django.db import models from django.forms import ModelForm from formsite.models import Request_Form from formsite.models import Serah_Terima class RequestForm(ModelForm): class Meta: model = Request_Form fields = ['Nama_Aplikasi', 'Departemen', 'Description', 'Nama_Atasan'] # 全局作用域执行数据库查询,makemigrations时会触发错误 form = RequestForm() request = Request_Form.objects.get(pk=1) form = RequestForm(instance=request) """ class SerahTerima(ModelForm): class Meta: model = Serah_Terima fields = ['Tanggal_Approval','Nama_Atasan','Comment'] # 字段名与模型不匹配 form = SerahTerima() serah = SerahTerima.objects.get(pk=1) form = SerahTerima(instance=request) """
views.py
from django.shortcuts import render from django.http import HttpResponse from django.http import HttpResponseRedirect from .forms import RequestForm def welcome(request): return HttpResponse("Welcome to the Home Page") def formpage(request): submitted = False if request.method == 'POST': form= RequestForm(request.POST) if form.is_valid(): form.save() return HttpResponseRedirect('myweb/formpage?submitted=True') # 路径错误 else: form = RequestForm # 缺少括号实例化表单 if 'submitted' in request.GET: submitted = True return render(request, 'myweb/formpage.html', {'form':form,'submitted':submitted})
urls.py(app级)
from django.urls import path from formsite import views urlpatterns = [ path('form/', views.formpage, name = 'formpage'), path('', views.welcome, name='welcome'), ]
urls.py(项目级)
from django.contrib import admin from django.urls import path from formsite import views urlpatterns = [ path('', views.welcome, name='home'), path('form/', views.formpage, name = 'formpage'), path('admin/', admin.site.urls), ]
formpage.html
{% {% extends 'base.html' %}%} <!-- 语法错误 --> <h2>For App Request </h2> <hr> {%if submitted%} Data is Submitted {% else %} <form-action="",method="post"> <!-- 属性名错误 --> {% csrf_token %} {{ form.as_p }} <inpu> <!-- 无效标签 --> <input type="Submit" value="Submit"> </form> {% endif %}
base.html
<!DOCTYPE !html> <!-- 语法错误 --> <html lang="en"> <head> <link rel="stylesheet" href="style.css">` <!-- 多余反引号 --> <title>Form Login Page</title> </head> <body> <div id="sidebar"> <ul> <li><a href="/myweb">Home</a></li> <!-- 路径不匹配项目URL配置 --> <li><a href="myweb/formpage">formpage</a></li> <!-- 路径不匹配项目URL配置 --> </ul> </div> </body> </html>
问题修复方案
1. 解决makemigrations核心报错
forms.py中全局作用域的Request_Form.objects.get(pk=1)会在Django启动(包括执行makemigrations)时执行,此时数据库中还没有pk=1的记录,导致报错。必须将表单实例化和数据库查询代码移到视图函数中,forms.py只保留ModelForm类定义:
修改后的forms.py:
from django.forms import ModelForm from formsite.models import Request_Form, Serah_Terima class RequestForm(ModelForm): class Meta: model = Request_Form fields = ['Nama_Aplikasi', 'Departemen', 'Description', 'Nama_Atasan'] class SerahTerima(ModelForm): class Meta: model = Serah_Terima fields = ['TanggalApproval', 'Atasan', 'Comment'] # 修正字段名与模型匹配
2. 修复models.py中的错误
- 字段定义必须加括号实例化:
TanggalReq = models.DateTimeField() TanggalApproval = models.DateField() Comment = models.TextField() - 修正
Serah_Terima的__str__方法:def __str__(self): return str(self.Kode_Permintaan) # 使用模型存在的字段 - 修改重复的
related_name:Atasan = models.ForeignKey(Request_Form, on_delete=models.CASCADE, to_field='Nama_Atasan', related_name='atasan_serah_terima') - 若
No_Permintaan不需要用户手动输入,可改为自动生成主键:No_Permintaan = models.AutoField(primary_key=True)
3. 修复views.py逻辑错误
调整表单处理逻辑,修正路径和表单实例化问题:
from django.shortcuts import render from django.http import HttpResponse, HttpResponseRedirect from django.urls import reverse from .forms import RequestForm def welcome(request): return HttpResponse("Welcome to the Home Page") def formpage(request): submitted = 'submitted' in request.GET if request.method == 'POST': form = RequestForm(request.POST) if form.is_valid(): form.save() # 使用命名URL重定向,避免硬编码路径 return HttpResponseRedirect(reverse('formpage') + '?submitted=True') else: # GET请求时初始化空表单 form = RequestForm() return render(request, 'myweb/formpage.html', {'form': form, 'submitted': submitted})
4. 修复模板语法和路径错误
修改formpage.html:
{% extends 'base.html' %} {% block content %} <h2>For App Request </h2> <hr> {% if submitted %} Data is Submitted {% else %} <form action="" method="post"> {% csrf_token %} {{ form.as_p }} <input type="Submit" value="Submit"> </form> {% endif %} {% endblock %}
修改base.html:
<!DOCTYPE html> {% load static %} <html lang="en"> <head> <link rel="stylesheet" href="{% static 'style.css' %}"> <title>Form Login Page</title> </head> <body> <div id="sidebar"> <ul> <li><a href="{% url 'home' %}">Home</a></li> <li><a href="{% url 'formpage' %}">formpage</a></li> </ul> </div> {% block content %}{% endblock %} </body> </html>
注意:需要在项目
settings.py中配置STATIC_URL,并将style.css放在app的static目录下。
5. 执行迁移命令
完成上述修改后,重新执行迁移:
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者SeenIt90210
相关产品推荐
相关产品推荐

