【问题标题】:Create form set of arbitrary form types in Django forms在 Django 表单中创建任意表单类型的表单集
【发布时间】:2017-12-12 23:55:37
【问题描述】:

我知道给定一个表单类型,我可以创建一个表单集,允许我根据给定的表单类型创建一组表单。但是,这并不能完全解决我的问题。

假设我有一个快餐店的门户,用户可以在其中添加项目,在他们选择项目后,我们为额外的字段生成表单。例如,如果他们添加一个项目并选择食物类型“饮料”,那么我们会为他们提供添加冰块或让它开始的选项。如果他们选择热食,我们会询问他们是否喜欢辣味。我正在努力使用 Django 表单来实现这一点。如果我有一个包含所有选项的超级表单,无论项目类型如何,我都可以通过创建 FormSet 来完成此操作,但这不是我们正在做的。

当用户使用以下代码更改项目类型时,我可以完成创建新表单并动态更新每个项目:

在 HTML 模板中,我添加以下内容来创建模板。

{% for food_order_form in food_order_form_set %}
    <script id="food-order-template-{{ food_order_form.name }}" type="text/x-custom-template">
        {{ food_order_form.form.as_p }}
    </script>
{% endfor %}

然后我有基于全局变量创建这些表单的 JavaScript 代码:

var all_items = [{'name': 'food'}, {'name': 'drink'}];
$(document).ready(function() {
        all_tasks.forEach(function (item, index) {
            $("#items-container").append(
                '<form id="food-order-inline-form-' + index + '">' +
                    $('#food-order-template-' + item.name).html() +
                '</form>'
            );
        });
    });

我可以通过更改all_items 并调用函数再次呈现表单来指定应该创建哪些表单,但是,我无法轻松显示验证错误。我可以一起破解一些东西来实现这一点,但对于这样的事情来说,破解似乎太多了。使用 Django 是否有更好和/或更清洁的方法?

【问题讨论】:

    标签: javascript python django forms django-forms


    【解决方案1】:

    我能提供的唯一方法(我仍然是一个 django 初学者)是我在这里解决我的问题的方法: heterogenous forms associated with entries in a query_set

    我的解决方案是分配一个表单prefix,其中包含问题主键的字符串表示形式(我建议在您的情况下这将是饮料,通过显示所有饮料选项的表单选择答案: -“可乐”、“无冰”)。

    我没有使用表单集,而是将表单打包到 form[question] 字典中,并引入了 |get_item: 模板标签过滤器来解压它们。从这里: query dict object in Django template language

    这缺乏我认为您正在寻找的交互性 - 我只能使用按钮显示/隐藏。如果用户想要第二杯饮料,那将很困难 - 可能是表单集和“额外”参数,但我还没有使用它们。

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 2018-02-05
      • 2021-03-10
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2011-12-11
      • 2020-07-18
      相关资源
      最近更新 更多