如果我们单击"添加更多"按钮并将其存储在 django 中,如何在 django 中循环访问表单并添



我真正想做的是,如果用户单击"添加更多"按钮,那么相同的表单会重复自己,并且值应该存储在数据库中,如果他/她不单击该按钮,那么只应该存储第一个表单中的值。

我无法得到这个,我只是创建了一个表单,并在数据库中创建了一个表格来获取这些详细信息,但无法在数据中循环通过表单。

请帮忙。

这是窗体和按钮:

这是 model.py 代码:

from django.db import models
class experience(models.Model):
company_name = models.CharField(max_length=100)
address = models.CharField(max_length=100)
startdate = models.Datefield(default = 01-01-2020)
lastdate = models.DateField(default = 01-01-2020)
profile = models.CharField(max_length=100)
description = models.TextField(max_length = 250)

这是 views.py 代码:

from django.shortcuts import render, redirect
import requests
from django.contrib.auth.models import User, auth

# Create your views here.
def profile(request):
return render(request, 'profile.html')

不幸的是,Django 中没有内置的方法(据我所知(可以在没有 Javascript 的情况下做到这一点,但这里有一种方法:

.HTML:

<div class="container" id="experiencesContainer">
<form method='POST' name='experienceForm'>
{{form.as_p}}
</form>
<form method='POST' name='experienceForm'>
{{form.as_p}}
</form>
<button type="button" id="addMoreButton">Add more</button>
<button type="submit">Save Changes</button>
</div>

Django POST 方法:

# Get a list of submitted forms
experiences = request.POST.getlist('experienceForm')
for experience in experiences:
# this is how you loop throuh every form
experience.get('company_name)

你的JavaScript是这样的:

// clonning his childs as well
let cloneForm = document.querySelector('form[name=experienceForm]').cloneNode(true);
document.querySelector('div#experiencesContainer').appendChild(cloneForm);
// see this https://www.w3schools.com/jsref/met_node_clonenode.asp

当然,这段代码没有经过测试,但我之前已经在几个项目中做过,希望它能工作!

一个简单的方法是从"添加"请求相同的视图,只需确保您的表单视图在请求方法为 POST 时保存数据即可。

<form action="{% url 'your-form-url' %}" method="GET">
{% csrf_token %}
<input type="submit" value="Add">
</form>

重复表单的另一种方法是使用表单集。表单集允许您重复相同的表单"额外"次数。查看文档以获取有关此内容的更多信息。

def repeat_form(request):
ExpFormSet = formset_factory(ExperienceForm, extra=3)
#extra defines the no. of forms you want to display
if request.method == 'POST':
formset = ExpFormSet(request.POST, request.FILES)
if formset.is_valid():
# do something with the formset.cleaned_data
#loop through each form in the formser
for form in formset.cleaned_data:
obj = form.save()
else:
formset = ExpFormSet()
return render(request, 'exp_form.html', {'formset': formset})

相应的模板应为:-

<form method="post">
{{ formset.management_form }}
{% for form in formset %}
{{ form.as_p }}
{% endfor %}
</form>

确保添加form.management_form。使用上述组合可能会解决获取和保存多个输入的问题。

最新更新