在Django表单

时间:2017-12-12 23:55:38

标签: javascript python django forms django-forms

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

假设我有一个快餐店的门户网站,用户可以在其中添加项目,在他们选择项目后,我们会为额外的字段生成表单。例如,如果他们添加一个项目并选择食物类型“饮料”,那么我们给他们选择添加冰或让它去。如果他们选择热食,我们会问他们是否喜欢辣。我正在努力用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有更好和/或更清晰的方法吗?

1 个答案:

答案 0 :(得分:0)

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

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

而不是formset,我将表单打包成一个表单[question]字典,并引入了一个| get_item:template标签过滤器来解压缩它们。从这里: query dict object in Django template language

这缺乏我认为您正在寻找的交互性 - 我只能使用按钮显示/隐藏。如果用户想要第二次饮料,那将很困难 - 可能是一个formset和'extra'参数,但我还没有使用它们。