Django crispy-form表单数据无法存入数据库问题求助
解决Django crispy-form表单无法调用save()保存数据的问题
问题根源
报错AttributeError: 'FormNowaFirma' object has no attribute 'save'的直接原因是你的FormNowaFirma类继承了普通的forms.Form,而非与数据库模型绑定的forms.ModelForm。只有ModelForm内置了save()方法,用来将表单数据直接保存到对应模型的数据库表中;普通Form是通用表单,没有与模型关联,因此没有这个方法。
解决方案:将表单类改为ModelForm
修改你的forms.py代码,把FormNowaFirma的继承对象从forms.Form换成forms.ModelForm,并通过Meta类关联对应的数据库模型和字段:
修改前的forms.py(示例)
from django import forms from crispy_forms.helper import FormHelper from crispy_forms.layout import Layout, Submit class FormNowaFirma(forms.Form): nazwa = forms.CharField(max_length=100) adres = forms.CharField(max_length=200) # 其他自定义字段 def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.helper = FormHelper() self.helper.layout = Layout( 'nazwa', 'adres', Submit('submit', 'Zapisz') )
修改后的forms.py
from django import forms from crispy_forms.helper import FormHelper from crispy_forms.layout import Layout, Submit from .models import Firma # 替换成你实际的模型类 class FormNowaFirma(forms.ModelForm): # 保持crispy-form的样式配置不变 def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.helper = FormHelper() self.helper.layout = Layout( 'nazwa', 'adres', Submit('submit', 'Zapisz') ) # 新增Meta类,关联模型和字段 class Meta: model = Firma # 指定对应的数据库模型 fields = ['nazwa', 'adres'] # 指定需要渲染的字段,可用'__all__'包含所有字段
视图层代码保持不变
你的views.py中调用form.save()的逻辑无需修改,只要表单是ModelForm且验证通过,save()方法就会自动将数据保存到数据库:
from django.shortcuts import render, redirect from .forms import FormNowaFirma def dodaj_firme(request): if request.method == 'POST': form = FormNowaFirma(request.POST) if form.is_valid(): form.save() # 现在可正常执行 return redirect('success_page') # 替换成你的成功跳转URL else: form = FormNowaFirma() return render(request, 'your_template.html', {'form': form})
特殊情况:必须使用普通Form的处理(不推荐)
如果因业务需求必须使用forms.Form,则需要在视图中手动创建模型实例并保存,示例如下:
if form.is_valid(): # 从表单清洗后的数据中获取字段值 cleaned_data = form.cleaned_data # 创建模型实例并保存到数据库 Firma.objects.create( nazwa=cleaned_data['nazwa'], adres=cleaned_data['adres'] # 其他字段对应赋值 )
内容的提问来源于stack exchange,提问作者Marcin Lipiński
相关产品推荐
相关产品推荐

