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

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>

错误原因说明

  1. 表单类错误:__init__方法被错误放置在Meta类内部,导致初始化逻辑失效;widgets配置使用了不存在的字段名name。
  2. 视图逻辑错误:重复创建表单实例,直接给表单对象赋值字段的方式不符合ModelForm规范;使用initial传递后台字段值,但POST请求下表单优先读取POST数据,导致必填字段缺失验证失败;错误调用模型类的save()方法,而非表单实例的save()。
  3. 模板冗余:保留了无需显示的隐藏字段,且存在未闭合的HTML标签。

内容的提问来源于stack exchange,提问作者Fulbert KOFFI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 03:50:53