我想在同一个模型的同一页面中使用多个表单。
好的,让我们放轻松。
我有社交模块,有3个属性(网络,网址和图片)字段。 我在社交数据库中添加了4个值(Facebbok,Twitter,Youtube,Pinterest)
在设置视图(settings.html)中,我希望所有4个表单(适用于Facebook,Twitter等)进行编辑。
类似的东西:
Facebook:文字输入(包含当前的facebook网址)
Youtube:文字输入(包含当前的youtube网址)
等
因此,当我转到settings.html时,我可以更改,更新所有网络的社交网址。
对于常规设置模块,我有类似的东西(有3个字段,标题,符号,描述和1个属性,因为网站有1个标题,1个slug和1个描述)。对于这个非常简单,我可以使用get_object_or_404,因为设置模块只有1个值,我可以选择它..但问题是社交模块有更多的值,我想在我的页面上有所有表单,所以我可以编辑如何我想要的。
views.py
def settings(request):
sidebar_items = Sidebar.objects.order_by('position')
social_items = Social.objects.order_by('network')
settings = get_object_or_404(Settings, pk = 1)
if request.method == "POST":
form_settings = SettingsForm(request.POST, instance = settings)
if form_settings.is_valid():
settings = form_settings.save(commit = False)
settings.save()
return HttpResponseRedirect('/dashboard/settings')
else:
form_settings = SettingsForm(instance = settings)
context = {'sidebar_items' : sidebar_items, 'form_settings' : form_settings, 'social_items' : social_items}
return render(request, 'dashboard/settings.html', context)
答案 0 :(得分:2)
Django并不关心你想在视图中初始化多少个表单。如果他们使用同一型号,您可以使用formset。否则,您可以根据需要初始化和创建对象。
示例:
def your_view(request):
social_items = Social.objects.order_by('network')
forms = []
for index, social_item in enumerate(social_items):
forms.append(SocialForm(request.POST or None, instance=social_item,
prefix="form_{}".format(index)))
if request.method == 'POST':
for form in forms:
if form.is_valid():
form.save()
# do whatever next
return render(request, 'some-template.html', {'forms': forms})
您的模板中不需要三个单独的表单标记。您可以在一个帖子中提交所有数据。 Django将尝试从POST数据中为每个模型的实例进行水合,如果失败则返回任何错误。
在您的模板中,您需要遍历表单实例:
# some-template.html
<form action="." method="post" enctype="x-www-form-urlencoded">
{% for form in forms %}
<ol>
<li>
{{ form.network }}
{{ form.network.errors }}
</li>
<li>
{{ form.url }}
{{ form.url.errors }}
</li>
<li>
{{ form.image }}
{{ form.image.errors }}
</li>
</ol>
{% endfor %}
<button type="submit">Save</button>
</form>