Django在同一个模型的一个页面中使用多个表单

时间:2015-12-01 14:29:15

标签: django forms

我想在同一个模型的同一页面中使用多个表单。

好的,让我们放轻松。

我有社交模块,有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)

1 个答案:

答案 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>