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

Django项目表单数据无法存入数据库问题求助

Django表单无法写入数据库问题修复

问题概述

开发Django项目时,表单提交后数据无法写入数据库,需排查代码中的错误并修正。

代码问题排查与修复

1. forms.py 错误修复

原问题:导入的模型类名称错误,应导入AusenciasFormulario而非AusenciasForm。

修复后代码:

from django import forms
from .models import AusenciasFormulario
from django.contrib.auth.models import User

class AusenciasForm(forms.ModelForm):
    class Meta:
        model = AusenciasFormulario
        fields = '__all__'
        widgets = {'fecha': forms.DateInput(attrs={'type': 'date'})}

2. models.py 错误修复

原问题:jugador字段定义错误,直接赋值User不是Django合法的数据库字段类型,需定义为外键关联User模型。

修复后代码:

from django.db import models
import datetime
from django.contrib.auth.models import User
from django.urls import reverse

class AusenciasFormulario(models.Model):
    fecha = models.DateField("Date", default=datetime.date.today)
    razon = [
        ('Estudios/Examen','Estudios/Examen'),
        ('Enfermedad','Enfermedad'),
        ('Lesión','Lesión'),
        ('Motivos personales','Motivos personales'),
        ('Motivos familiares','Motivos familiares'),
        ('Otros','Otros')
    ]
    motivo = models.CharField(max_length=100, choices=razon, default='Otros')
    comentarios = models.CharField(max_length=200, blank=True)
    # 修复外键字段定义,添加on_delete参数
    jugador = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.jugador.username} - {self.fecha}"

3. views.py 错误修复

原问题:

  • 视图类继承HttpRequest无意义,无需继承该类;
  • index方法中AuForm未定义,应改为AusenciasFormulario.objects.all();
  • 注释掉if request.method == 'POST'判断,导致GET请求也会进入表单处理逻辑;
  • 表单处理函数未关联到URL,且未自动填充当前登录用户到jugador字段。

修复后代码:

from django.shortcuts import render, redirect
from .forms import AusenciasForm
from .models import AusenciasFormulario

def formulario_ausencia(request):
    # 显示表单页面
    if request.method == 'GET':
        form = AusenciasForm()
        return render(request, 'blog/formularioAusencia.html', {'form': form})

def procesar_formulario(request):
    # 处理表单提交
    if request.method == 'POST':
        form = AusenciasForm(request.POST)
        if form.is_valid():
            # 关联当前登录用户到jugador字段
            ausencia = form.save(commit=False)
            ausencia.jugador = request.user
            ausencia.save()
            return redirect('ausencias')
    # GET请求或表单无效时返回空表单
    form = AusenciasForm()
    return render(request, 'blog/formularioAusencia.html', {'form': form})

def ausencias(request):
    # 展示所有请假记录
    ausencias_formulario = AusenciasFormulario.objects.all()
    return render(request, 'blog/ausencias.html', {'ausencias_formulario': ausencias_formulario})

4. urls.py 错误修复

原问题:缺少表单处理函数的URL映射,且表单页面URL指向错误视图方法。

修复后代码:

from django.urls import path
from .views import (PostListView, PostDetailView, PostCreateView,
                    PostUpdateView, PostDeleteView, UserPostListView,
                    formulario_ausencia, procesar_formulario, ausencias)
from . import views
from django.contrib.auth.decorators import login_required

urlpatterns = [
    path('', login_required(PostListView.as_view()), name='blog-home'),
    path('user/<str:username>', login_required(UserPostListView.as_view()), name='user-posts'),
    path('post/<int:pk>/', login_required(PostDetailView.as_view()), name='post-detail'),
    path('post/new/', login_required(PostCreateView.as_view()), name='post-create'),
    path('post/<int:pk>/update/', login_required(PostUpdateView.as_view()), name='post-update'),
    path('post/<int:pk>/delete/', login_required(PostDeleteView.as_view()), name='post-delete'),
    path('about/', views.about, name='blog-about'),
    # 表单页面URL
    path('formularioAusencia/', login_required(formulario_ausencia), name='formularioAusencia'),
    # 表单提交处理URL
    path('procesar-formulario/', login_required(procesar_formulario), name='procesar_formulario'),
    # 记录展示页面URL
    path('ausencias/', login_required(ausencias), name='ausencias'),
]

5. 模板文件错误修复

原问题:表单action指向展示页面ausencias,而非表单处理函数,导致提交后无法处理数据。

修复后代码:

{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
    <div class="media">
        <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
        <div class="media-body">
            <h2 class="account-heading">{{ user.username }}</h2>
            <p class="text-secondary">{{ user.email }}</p>
        </div>
    </div>
    {% if user.is_authenticated %}
        <p>Rellenar si no vas a poder acudir a un próximo entrenamiento o partido</p>
        <form method="POST" action="{% url 'procesar_formulario' %}">
            {% csrf_token %}
            {{ form|crispy }}
            <button class="btn btn-danger btn-sm mt-1 mb-1" type="submit">Enviar</button>
        </form>
    {% endif %}
</div>
{% endblock content %}

额外操作

修改模型后,需执行数据库迁移更新表结构:

python manage.py makemigrations
python manage.py migrate

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:45:35