django:发送 POST 以从可能无限的表单中查看的正确方法
Posted
技术标签:
【中文标题】django:发送 POST 以从可能无限的表单中查看的正确方法【英文标题】:django: proper way to send POST to view from potentially unlimited forms 【发布时间】:2017-03-05 15:49:01 【问题描述】:在我的 django 应用程序中,我有一个页面,理论上用户可以添加任意数量的地址。我有一个包含典型信息(地址、城市、邮政编码)的 django 地址表单,用户可以根据需要创建任意数量的这些 django 表单,并且这些表单除了唯一的 ID 之外都是相同的。我的问题是我需要用户能够单击提交按钮,该按钮会将所有表单提交到我可以处理地址的视图。
类似问题的其他答案似乎对我不起作用,目前我的方法涉及遍历表单并在按下提交按钮时在每个表单上调用 jquery 的 submit() 函数,但这种方法不起作用。理想情况下,我最终会在我的视图中收到一个 POST 请求,其中包含来自所有表单的所有地址信息,以便我可以在视图中轻松处理它。
【问题讨论】:
您研究过表单集吗?据我所知,他们完全符合您的需要。 docs.djangoproject.com/en/1.10/topics/forms/formsets 【参考方案1】:您可以通过以下方式使用带有前缀的 ModelForms 来解决此问题:
models.py:
class Address(models.Model):
street = models.CharField(max_length=100)
city = models.CharField(max_length=100)
class AddressForm(ModelForm):
class Meta:
model = Address
fields = ['street', 'city']
views.py:
def addresses(request):
if request.method == 'POST':
for i in range(int(request.POST['num_of_addresses'])):
address = AddressForm(request.POST, prefix='address%d'%i)
address.save()
return HttpResponse('Addresses saved successfully')
num_of_addresses = 10 # As many as you want
forms = []
for i in range(num_of_addresses):
forms.append(AddressForm(prefix='address%d'%i))
return render(request, 'address.html', context=
'forms': forms,
'num_of_addresses': num_of_addresses,
)
地址.html:
<form method="POST">
% csrf_token %
% for form in forms %
form
<br />
% endfor %
<input type="hidden" name="num_of_addresses" value=" num_of_addresses " />
<button type="submit">Submit</button>
</form>
如果您检查生成的 HTML,您会看到地址表单中的每个元素都有一个 addressN-
形式的前缀,这有助于视图区分并相应地保存它们。
你也可以有一个动态添加地址表单的 jquery 函数(记得增加 num_of_addresses 字段),它会完美地工作。
希望对你有帮助
【讨论】:
以上是关于django:发送 POST 以从可能无限的表单中查看的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
使用 JQUERY UI 向 Django 发送 POST 数据