在模板上隐藏ModelMultipleChoiceField以进行自定义输入

时间:2017-10-12 14:46:01

标签: django django-forms

我希望用户选择属于某个型号的多个元素。我不想使用默认的&c; ctrl + click'输入django表单,但我自己创建一个复选框表。

出于这个原因,我通过定义小部件来隐藏ModelMultipleChoiceField:

field = forms.ModelMultipleChoiceField(..., widget=forms.MultipleHiddenInput())

然后我将表单元素添加到模板中,如下所示:

<form method="POST" class="locklist-form" id="locklist-form">{% csrf_token %}
    {{ form.field }}
</form>

在这一步,我希望将select-option元素添加到HTML页面(隐藏),以便我可以访问元素选项并使用javascript修改它们。但是,它不会向HTML页面添加任何内容。

我将这种方法用于其他类型的表格。对于TextField HTML页面,有一个隐藏元素,如下所示: Hidden element of form.TextField

为什么它不能与ModelMultipleChoiceField一起使用?如何使用Javascript修改此字段的选项?

编辑: MultipleHiddenInput renders only if with initial data是一个类似的问题。但应用它并不会导致预期的解决方案。在这个问题中,预计会将以下内容呈现为隐藏: expected render 但是在MultipleHiddenInput renders only if with initial data之后,当我将表单构造函数修改为:

form = MyForm(initial={'field':MyModel.objects.all()})

渲染元素如下: render got

它可能有用,但不完全是预期的。我需要在一个对象列表中标记一些选项。

1 个答案:

答案 0 :(得分:0)

我使用Javascript完成它,而不是依赖Django的功能。我将带有ModelMultipleChoiceField的表单直接添加到模板(未隐藏)。然后我在加载页面时运行Javascript脚本:

var field = document.getElementById('id_field');
selecter.setAttribute('class', 'hidden');

隐藏类的CSS定义如下:

.hidden{
    display: none;
}

这让我想到了理想的情况。 ModelMultipleChoiceField隐藏如下: satisfied case

此时,我可以通过Javascript修改某些项目:

document.getElementById('id_field').options[index].selected = boolValue;