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

如何保留Django表单自定义属性并将POST数据保存到数据库

Django联系表单数据保存解决方案

你的代码存在两个核心问题导致无法正常保存数据:

  • 当前使用的forms.Form是普通表单类,没有内置save()方法,直接调用会抛出异常
  • 视图中的请求处理逻辑完全写反:POST请求时初始化了空表单,反而GET请求时才尝试读取POST数据,不符合Django表单处理规范

你可以选择以下任意一种方案实现需求,原有表单的class、placeholder等样式属性会完全保留,不会影响现有CSS适配。

方案1(推荐):将表单改为ModelForm

直接继承Django的ModelForm,可以自动关联模型字段,无需手动处理数据映射。
修改后的forms.py代码如下:

from django import forms
from .models import InformationRequest

class ContactForm(forms.ModelForm):
    # 原有的字段配置完全保留,样式不受影响
    from_email = forms.EmailField(required=True, widget=forms.TextInput(attrs={'class': 'contact__input', 'placeholder': 'Email'}))
    subject = forms.CharField(required=True, widget=forms.TextInput(attrs={'class': 'contact__input', 'placeholder': 'Subject'}))
    message = forms.CharField(widget=forms.Textarea(attrs={'class': 'contact__input', 'cols': 0, 'rows': 8, 'placeholder': 'Message'}), required=True)

    class Meta:
        # 关联对应的模型类
        model = InformationRequest
        # 指定需要映射的字段
        fields = ['from_email', 'subject', 'message']

方案2:保留普通Form,手动保存数据

如果你不想修改原有表单的继承关系,也可以在表单验证通过后手动读取清理后的数据存入数据库,无需修改forms.py文件。

统一修正视图逻辑

无论选择哪种方案,都需要修正views.py中的请求处理逻辑,修改后的代码如下:

from django.shortcuts import render, redirect
from .models import Home, About, Profile, Category, Skills, Portfolio
from .forms import ContactForm
from django.core.mail import send_mail, BadHeaderError
from django.http import HttpResponse, HttpResponseRedirect


def index(request):
   # Home
   home = Home.objects.latest('updated')

   # About
   about = About.objects.latest('updated')
   profiles = Profile.objects.filter(about=about)

   # Skills
   categories = Category.objects.all()

   skills = Skills.objects.all()

   # Portfolio
   portfolios = Portfolio.objects.all()

   if request.method == 'POST':
       # POST请求绑定提交的表单数据
       form = ContactForm(request.POST)
       if form.is_valid():
           # 使用方案1的ModelForm直接调用save即可
           form.save()
           # 如果使用方案2保留普通Form,替换上面的form.save()为以下代码即可
           # InformationRequest.objects.create(
           #     from_email=form.cleaned_data['from_email'],
           #     subject=form.cleaned_data['subject'],
           #     message=form.cleaned_data['message']
           # )
           return redirect('success')
   else:
       # GET请求初始化空表单
       form = ContactForm()

   context = {
       'home': home,
       'about': about,
       'profiles': profiles,
       'categories': categories,
       'portfolios': portfolios,
       'form': form,
       'skills': skills,
   }

   return render(request, 'index.html', context)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:42:03