python - 动态保存表单
问题描述
我试图不在我的表单中使用 formset。相反,我尝试动态创建表单并将所有表单数据保存在数据库中。目前,我可以创建一个动态表单,但问题是即使我创建了多个表单,我也无法保存表单中的所有数据。现在我的代码只能保存一种形式。但我想将整个表单(带有多个表单数据)保存在数据库中。
视图.py
def create_order(request):
from django import forms
form = OrderForm()
if request.method == 'POST':
forms = OrderForm(request.POST)
if forms.is_valid():
po_id = forms.cleaned_data['po_id']
supplier = forms.cleaned_data['supplier']
product = forms.cleaned_data['product']
part = forms.cleaned_data['part']
order = Order.objects.create(
po_id=po_id,
supplier=supplier,
product=product,
part=part,
)
return redirect('order-list')
context = {
'form': form
}
return render(request, 'store/addOrder.html', context)
表格.py
class OrderForm(forms.ModelForm):
class Meta:
model = Order
fields = ['supplier', 'product', 'part','po_id']
widgets = {
'supplier': forms.Select(attrs={'class': 'form-control', 'id': 'supplier'}),
'product': forms.Select(attrs={'class': 'form-control', 'id': 'product'}),
'part': forms.Select(attrs={'class': 'form-control', 'id': 'part'}),
}
HTML
<form action="#" method="post" id="form-container" novalidate="novalidate">
{% csrf_token %}
<div class="form">
<div class="form-group">
<label for="po_id" class="control-label mb-1">ID</label>
{{ form.po_id }}
</div>
<div class="form-group">
<label for="supplier" class="control-label mb-1">Supplier</label>
{{ form.supplier }}
</div>
<div class="form-group">
<label for="product" class="control-label mb-1">Product</label>
{{ form.product }}
</div>
<div class="form-group">
<label for="part" class="control-label mb-1">Part Name</label>
{{ form.part }}
</div>
</div>
<button id="add-form" type="button">Add Another Order</button>
<div>
<button id="payment-button" type="submit" class="btn btn-lg btn-success btn-block">
<span id="payment-button-amount">Save</span>
</button>
</div>
</form>
<script>
let poForm = document.querySelectorAll(".form")
let container = document.querySelector("#form-container")
let addButton = document.querySelector("#add-form")
let totalForms = document.querySelector("#id_form-TOTAL_FORMS")
let formNum = poForm.length-1
addButton.addEventListener('click', addForm)
function addForm(e){
e.preventDefault()
let newForm = poForm[0].cloneNode(true)
let formRegex = RegExp(`form-(\\d){1}-`,'g')
formNum++
newForm.innerHTML = newForm.innerHTML.replace(formRegex, `form-${formNum}-`)
container.insertBefore(newForm, addButton)
totalForms.setAttribute('value', `${formNum+1}`)
}
</script>
解决方案
if request.method == 'POST':
forms = OrderForm(request.POST)
if forms.is_valid():
po_id = forms.cleaned_data['po_id']
supplier = forms.cleaned_data['supplier']
product = forms.cleaned_data['product']
part = forms.cleaned_data['part']
forms.save() # add save here
order = Order.objects.create(
po_id=po_id,
supplier=supplier,
product=product,
part=part,
)
return redirect('order-list')
推荐阅读
- bash - 类 RunLoopModeTracker 在两者中都实现 - Qt
- sqlite - Xamarin Forms Picker SelectedItem 到现有 SQLite 表
- json - 在 Python 3 中,如何在对象都以相同名称开头的情况下对 JSON 数据进行切片?
- python - geckodriver 不会使用 Profile 加载扩展?
- python - 遇到 AxisError:轴 1 超出了维度为 0 的数组的范围
- sql - 如何在电话号码上添加验证?
- react-native - React native 我收到网络请求失败,使用 fetch 来发布图像
- c++ - 识别边界多边形的外边界 C++
- mysql - 如何连接到本地机器上容器中运行的 MySQL 实例?
- r - 将附加到数字的名称映射到数字的组合