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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:45:58