javascript - 如何使用 Django 和 JavaScript 提交多个表单?
问题描述
我正在开发一个在索引页面上显示表单的应用程序,您可以在其中输入信息以最终计算总额并根据表单输入输出其他详细信息。
- 我的表单继承自 form.Forms。
- 一个按钮,“添加行”,根据需要创建该行的多个副本。
每个表单都包含一个 ID 为“calc-form”的表单。我的问题是 POST 方法中只包含一个表单。我想一键处理所有表格。
单击“计算”时,如何在 POST 方法中包含所有其他表单?
索引.html
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
{% load static %}
<script type="text/javascript" src="{% static 'app.js' %}"></script>
<table id="table-id">
<tr id='table-row'>
<form id="calc-form" action="{% url 'result' %}" method="post">
{% csrf_token %}
{% for field in form %}
<td>{{ field|as_crispy_field }}</td>
{% endfor %}
</form>
</tr>
</table>
<br>
<input type="submit" value="Calculate" form="calc-form">
<button type="button" id="add-row-btn" onclick="addRow()">Add row</button>
<button type="button" id="delete-row-btn" onclick="deleteRow()">Delete last row</button>
{% endblock content %}
视图.py
from django.shortcuts import render
from .forms import TariffCalcForm
def index(request):
form = TariffCalcForm
context = {'form': form}
return render(request, 'clickapp/index.html', context)
def result(request):
context = {}
if request.method == 'POST':
for r in request:
form = TariffCalcForm(request.POST)
if form.is_valid():
context['form'] = form
return render(request, 'result.html', context)
else:
return render(request, 'index.html', context)
应用程序.js
function addRow() {
const formTable = document.getElementById('table-id');
const formRow = document.getElementById('table-row');
const formRowCopy = formRow.cloneNode(true);
formTable.appendChild(formRowCopy);
}
解决方案
表单向导可能是合适的。它允许您处理一系列表单,将提交每个表单的结果存储在客户端会话中。这当然是在数据库中,但它可以是暂时的,并且可以是匿名会话。最终提交可以处理来自所有表单的数据,并在为用户呈现结果页面之前将其从会话中删除(可能是自动的,不确定)。
根据之前的数据,跳过某些表格的能力有限。
另一种方法是基于客户端。您使用一个巨大的表单,但使用某种 Javascript 来引导用户逐节浏览它。前面部分的“提交”不涉及服务器,只是隐藏子表单并显示下一个(或在选项卡之间切换,用户也可以自己做)。方法的范围可以从简单的 Jquery 到庞大的 Javascript 框架。
推荐阅读
- c# - “无法在 DLL 'SQLite.Interop.dll' 中找到名为 'sqlite3_open_interop' 的入口点。”
- java - 如何在 java 中读取 json 文件,更新值并将其存储回同一个文件?
- angular - 如何解决 Angular 8 中的以下错误?
- awk - 按块名合并两个ini文件
- split - 尝试用 bigquery 中非空白行的值填充空白行
- swift - 如何使用 ARkit 在 GPS 坐标处放置 3D 对象
- .net-core - Automapper,如果提到 ConstructUsing,在现有对象上映射时不会触发 AfterMap
- java - 无需递归即可找到总和等于或小于给定数字的最大子集
- gcc - Apples gcc 可以与 GNUs gcc C/C++ 代码兼容吗?
- angular - 是否可以在 Angular 的新选项卡中打开 mat-dialog?