Django表单验证失败无法写入数据库,请求协助修复
问题排查与修复方案
核心问题分析
表单验证失败的根源是代码存在多处写法错误,导致后台字段(UTIL_CREATION、UTIL_MODIF、Soc_sigle)未被正确赋值,同时表单初始化、字段配置逻辑混乱。
分步修复
1. 修复表单类代码
将初始化方法移出Meta类,仅保留用户需要输入的字段,移除冗余配置:
from django import forms from .models import f_groupe_user from django.utils.translation import gettext_lazy as _ class f_groupe_userForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['LibELE_GROUPE'].widget.attrs.update({'class': 'form-control'}) class Meta: model = f_groupe_user fields = ['LibELE_GROUPE'] # 只保留用户需要输入的字段 labels = {'LibELE_GROUPE': 'Nom*'} help_texts = { "LibELE_GROUPE": _("Donner le nom du groupe utilisateur"), } error_messages = { "LibELE_GROUPE": { "max_length": _("Ce nom du groupe est trop long."), }, }
2. 修复视图函数代码
简化表单初始化逻辑,使用commit=False获取实例后赋值后台字段,再保存:
from django.shortcuts import render, redirect from .forms import f_groupe_userForm from django.conf import settings def Insert_group(request): print(f"La Request method est : {request.method}") sEtat = "crea" if request.method == 'POST': print('Je rentre dans group Insert_group avec POST') form = f_groupe_userForm(request.POST) if form.has_changed(): print("The following fields changed: %s" % ", ".join(form.changed_data)) if form.is_valid(): # 获取表单实例,暂不保存到数据库 groupe_user = form.save(commit=False) # 赋值后台维护的字段 groupe_user.UTIL_CREATION = settings.WCURUSER groupe_user.UTIL_MODIF = settings.WCURUSER groupe_user.Soc_sigle = settings.WSOCGEN # created_at/updated_at由模型自动处理,无需手动赋值 groupe_user.save() print('ajout effectué!!!') return redirect("CreateGroup/success") else: print(f"Erreurs du formulaire: {form.errors}") print('form pas valide') return render(request, 'appMenuAdministrator/L_liste_GroupeUtilisateur/FicheCreaGroupe.html', {'form': form}) else: form = f_groupe_userForm() return render(request, 'appMenuAdministrator/L_liste_GroupeUtilisateur/FicheCreaGroupe.html', {'form': form, 'sEtat': sEtat})
3. 修复HTML模板
移除所有无需显示的隐藏字段,仅保留用户输入项:
<div class="card card-body"> <h5>Informations</h5> <hr> <p>Nom:</p> <fieldset> <input name="LibELE_GROUPE" type="text" id="LibELE_GROUPE" size="35" placeholder="Nom du groupe" tabindex="1" required>* </fieldset> </div>
错误原因说明
- 表单类错误:
__init__方法被错误放置在Meta类内部,导致初始化逻辑失效;widgets配置使用了不存在的字段名name。 - 视图逻辑错误:重复创建表单实例,直接给表单对象赋值字段的方式不符合ModelForm规范;使用
initial传递后台字段值,但POST请求下表单优先读取POST数据,导致必填字段缺失验证失败;错误调用模型类的save()方法,而非表单实例的save()。 - 模板冗余:保留了无需显示的隐藏字段,且存在未闭合的HTML标签。
内容的提问来源于stack exchange,提问作者Fulbert KOFFI
相关产品推荐
相关产品推荐

