【问题标题】:Django Formset Custom Field ExclusionDjango Formset 自定义字段排除
【发布时间】:2014-12-06 01:28:41
【问题描述】:

我创建了一个包含 2 个单选按钮(男/女)的表单。下面将有一个名字和姓氏的输入框。如果我使用 formset 复制表单,它将包含每个输入框的单选按钮,我想排除它。假设一旦用户选择“男性”,姓名应该与他们选择的性别相匹配。

输出应该是这样的:

男男女女

名字:_______________ 姓氏:_______________

名字:_______________ 姓氏:_______________

...

forms.py

from django import forms


class NameForm (forms.Form):
    GENDER = (
        ('Male', 'Male'),
        ('Female', 'Female')
    )

    gender = forms.ChoiceField (widget = forms.RadioSelect, choices = GENDER)
    first_name = forms.CharField (max_length = 20)
    last_name = forms.CharField (max_length = 20)


Shell Output:
>>> from django.forms.formsets import formset_factory
>>> from nameform.forms import NameForm
>>> 
>>> NameFormSet = formset_factory (NameForm, extra = 2)
>>> formset = NameFormSet ()
>>> for form in formset:
...     print (form.as_table())
... 
<tr><th><label for="id_form-0-gender_0">Gender:</label></th><td><ul id="id_form-0-gender">
<li><label for="id_form-0-gender_0"><input id="id_form-0-gender_0" name="form-0-gender" type="radio" value="Male" /> Male</label></li>
<li><label for="id_form-0-gender_1"><input id="id_form-0-gender_1" name="form-0-gender" type="radio" value="Female" /> Female</label></li>
</ul></td></tr>
<tr><th><label for="id_form-0-first_name">First name:</label></th><td><input id="id_form-0-first_name" maxlength="20" name="form-0-first_name" type="text" /></td></tr>
<tr><th><label for="id_form-0-last_name">Last name:</label></th><td><input id="id_form-0-last_name" maxlength="20" name="form-0-last_name" type="text" /></td></tr>
<tr><th><label for="id_form-1-gender_0">Gender:</label></th><td><ul id="id_form-1-gender">
<li><label for="id_form-1-gender_0"><input id="id_form-1-gender_0" name="form-1-gender" type="radio" value="Male" /> Male</label></li>
<li><label for="id_form-1-gender_1"><input id="id_form-1-gender_1" name="form-1-gender" type="radio" value="Female" /> Female</label></li>
</ul></td></tr>
<tr><th><label for="id_form-1-first_name">First name:</label></th><td><input id="id_form-1-first_name" maxlength="20" name="form-1-first_name" type="text" /></td></tr>
<tr><th><label for="id_form-1-last_name">Last name:</label></th><td><input id="id_form-1-last_name" maxlength="20" name="form-1-last_name" type="text" /></td></tr>

【问题讨论】:

    标签: django python-3.x


    【解决方案1】:

    您需要一个表单和表单集。只包含名称的表单,包含重复元素的表单集。

    使用重复表单类并对其进行修改以区别对待第一个表单类并没有什么意义。

    或者,如果这是一个数据问题(比如旧界面),并且表单需要同时包含这两者。那么您可能会隐藏所有其他元素并使用 javascript 来填写隐藏的性别选择。

    实际上,您应该使用FormFormSet

    {{ form.as_p }}
    {% for form in formset %}
      {{ form.as_p }}
    {% endfor %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-18
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 2011-05-05
      • 1970-01-01
      • 2012-07-04
      相关资源
      最近更新 更多