【问题标题】:Django using more than one forms in one page from same modelDjango 在同一模型的一页中使用多个表单
【发布时间】:2015-12-01 14:29:15
【问题描述】:

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

好吧,让我们放轻松。

我有具有 3 个属性(网络、网址和图像)字符字段的社交模块。 我在社交数据库(Facebbok、Twitter、Youtube、Pinterest)中添加了 4 个值

在设置视图(settings.html)中,我希望拥有所有 4 个表单(用于 Facebook、Twitter 等)来编辑它们。

类似的东西:

Facebook:文本输入(包含当前的 facebook url)

Youtube:文本输入(包含当前 youtube url)

等等

所以当我转到 settings.html 时,我可以更改、更新所有网络的社交网址。

我对常规设置模块有类似的东西(有 3 个字段,标题、标签、描述和 1 个属性,因为网站有 1 个标题、1 个标签和 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)

【问题讨论】:

  • 是什么阻止您在上下文中添加更多表单?..

标签: django forms


【解决方案1】:

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>

【讨论】:

  • 不是我想要的。在社交模块中,我有 2 个值:Facebook 和 Twitter。在设置视图(settings.html)中,我希望拥有 facebook 表单和 twitter 表单来编辑它们。对于一个值,我可以使用 get_object_or_404,它很简单,但我的数据库中有 3-4 个值
  • 定义“价值观”。您是在谈论模型的实例吗?你有 Facebook 模型和 Twitter 模型吗?我认为您需要为您的问题添加更多信息。
  • 对,就像我提到的,您可以使用表单集来编辑它们,或者正如我所演示的,您可以将各个 social 实例传递给同一个表单类,如果您愿意的话。
  • 我更新了代码示例,展示了如何从 Social 实例初始化多个表单。
  • 好的.. 但现在我在 settings.html 中显示表单有问题.. {% for social in social_items %}

    {{ social_form.url }} {% endfor %}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 2010-10-08
相关资源
最近更新 更多