django 将单选按钮拆分为多个具有清晰窗体的组

ruarlubt  于 2023-03-09  发布在  Go
关注(0)|答案(1)|浏览(97)

我想创建一个django表单来计划一个会议。
我必须提出几个时隙,并按天重新分组,如下图所示。
是否可以通过对所有单选按钮使用相同的ChoiceField来对简洁的表单执行此操作?

camsedfj

camsedfj1#

Django已经这么做了,但是Crispy只在你使用Bootstrap v4模板包的时候才这么做。(**注意:**我的答案指的是Crispy 1.x。Crispy 2是几周前发布的,有一些重大的变化我还没有回顾,所以我的答案只适用于1.x版本。
如果您查看Django docs for the Field.choices value,它显示您可以使用如下结构:

from django import forms

CHOICES = [
    ('vendredi 17 fevrier 2023', (
        ('20230217_0900', 'De 09:00 a 09:00'),
        ('20230217_0920', 'De 09:20 a 09:40'),
    )),
    ('lundi 20 fevrier 2023', (
        ('20230220_1600', 'De 16:00 a 16:20'),
    ))
]

class MyForm(forms.Form):
    my_field = forms.ChoiceField(widget=forms.widgets.RadioSelect, choices=CHOICES)

当在Django模板({{ form }})中使用时,HTML的结构如您所愿:

<label for="id_my_field_0">My field:</label>
<ul id="id_my_field">
  <li>vendredi 17 fevrier 2023
    <ul id="id_my_field_0">
      <li>
        <label for="id_my_field_0_0"><input type="radio" name="my_field" value="20230217_0900" required="" id="id_my_field_0_0">
          De 09:00 a 09:00</label>
      </li>
      <li>
        <label for="id_my_field_0_1"><input type="radio" name="my_field" value="20230217_0920" required="" id="id_my_field_0_1">
          De 09:20 a 09:40</label>
      </li>
    </ul>
  </li>
  <li>lundi 20 fevrier 2023
    <ul id="id_my_field_1">
      <li>
        <label for="id_my_field_1_0"><input type="radio" name="my_field" value="20230220_1600" required="" id="id_my_field_1_0">
          De 16:00 a 16:20</label>
      </li>
    </ul>
  </li>
</ul>

但至于Crispy,它看起来只在您使用他们的Bootstrap v4模板时可用:https://github.com/django-crispy-forms/django-crispy-forms/blob/1.14.0/crispy_forms/templates/bootstrap4/layout/radioselect.html。请注意,它们在第6行循环optgroups。它们在提供的其他模板包中不会这样做。因此,如果您使用其他模板包之一,那么我认为您需要编写一个自定义小部件/模板。(在100%确定之前,我可能需要对此进行一些调查,b/c在Form.__init__方法中可能有一种方法可以做到这一点,在该方法中,您可以动态更新字段和小部件等。)
无论如何,这可能不能解决你的问题,但希望它能为你指明正确的方向。如果我能提供更多的帮助,请告诉我!

相关问题