如何在Django中将input.html内容传至approve.html验证并存储至数据库?
问题描述
我是一名Django新手,已经花了7天时间尝试解决这个问题,希望能得到帮助:如何将input.html中的全部表单内容传递到approve.html,让approve.html完成数据验证后将内容存储到数据库?
附上相关表单代码:
input.html的表单
<form action="/my-handling-form-page" method="post"> <ul> <li> <label for="name">Name:</label> <input type="text" id="name" name="user_name" /> </li> <li> <label for="mail">Email:</label> <input type="email" id="mail" name="user_email" /> </li> <li> <label for="msg">Message:</label> <textarea id="msg" name="user_message"></textarea> </li> <li> <button class="menü_button"><b>send</b></button> </li> </ul> </form>
approve.html的表单
<form action="/my-handling-form-page" method="post"> <ul> <li> <label for="name">Name:</label> <input type="text" id="name" name="user_name" /> </li> <li> <label for="mail">Email:</label> <input type="email" id="mail" name="user_email" /> </li> <li> <label for="msg">Message:</label> <textarea id="msg" name="user_message"></textarea> </li> <li> <button class="menü_button"><b>save</b></button> </li> <li> <button class="menü_button"><b>remote</b></button> </li> </ul> </form>
解决方案
Django中无法直接在模板间传递数据,必须通过视图层中转,以下是完整实现步骤:
1. 创建数据模型
在你的app的models.py里定义存储表单数据的模型:
from django.db import models class UserMessage(models.Model): user_name = models.CharField(max_length=100) user_email = models.EmailField() user_message = models.TextField() def __str__(self): return self.user_name
执行迁移命令创建数据库表:
python manage.py makemigrations python manage.py migrate
2. 编写视图函数
在app的views.py里添加两个视图:一个接收input页面的表单数据并传递到approve页面;另一个处理approve页面的保存请求,完成验证与入库。
from django.shortcuts import render, redirect from django import forms from .models import UserMessage # 复用验证逻辑的表单类 class MessageForm(forms.ModelForm): class Meta: model = UserMessage fields = ['user_name', 'user_email', 'user_message'] # 接收input页面提交,暂存数据后跳转至approve页面 def input_submit(request): if request.method == 'POST': request.session['form_data'] = request.POST.dict() return redirect('approve_page') return render(request, 'input.html') # 展示approve页面并处理保存请求 def approve_page(request): form_data = request.session.get('form_data', {}) if request.method == 'POST': form = MessageForm(request.POST) if form.is_valid(): form.save() del request.session['form_data'] return redirect('success_page') return render(request, 'approve.html', {'form': form}) else: form = MessageForm(initial=form_data) return render(request, 'approve.html', {'form': form}) # 可选:保存成功后的跳转页面视图 def success_page(request): return render(request, 'success.html')
3. 配置URL路由
在项目或app的urls.py中添加路由规则:
from django.urls import path from . import views urlpatterns = [ path('input/', views.input_submit, name='input_page'), path('approve/', views.approve_page, name='approve_page'), path('success/', views.success_page, name='success_page'), ]
4. 修改模板文件
更新input.html的表单
修改action指向对应路由,并添加Django必填的CSRF令牌:
<form action="{% url 'input_page' %}" method="post"> {% csrf_token %} <!-- 原表单内容保持不变 --> </form>
更新approve.html的表单
用Django表单渲染,自动预填数据并展示验证错误:
<form action="{% url 'approve_page' %}" method="post"> {% csrf_token %} <ul> <li> <label for="id_user_name">Name:</label> {{ form.user_name }} {% if form.user_name.errors %} <span style="color:red;">{{ form.user_name.errors.0 }}</span> {% endif %} </li> <li> <label for="id_user_email">Email:</label> {{ form.user_email }} {% if form.user_email.errors %} <span style="color:red;">{{ form.user_email.errors.0 }}</span> {% endif %} </li> <li> <label for="id_user_message">Message:</label> {{ form.user_message }} {% if form.user_message.errors %} <span style="color:red;">{{ form.user_message.errors.0 }}</span> {% endif %} </li> <li> <button class="menü_button"><b>save</b></button> </li> <li> <button class="menü_button" type="button" onclick="window.location.href='{% url 'input_page' %}'"><b>remote</b></button> </li> </ul> </form>
关键注意事项
- 用
session暂存input页面的表单数据,确保跳转后数据不丢失; - 使用
ModelForm自动完成数据验证与入库,避免重复编写逻辑; - 所有POST表单必须添加
{% csrf_token %},这是Django的安全防护机制,防止CSRF攻击。
内容的提问来源于stack exchange,提问作者replaalpi
相关产品推荐
相关产品推荐

