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
相关产品推荐
相关产品推荐

