A caixa de seleção BooleanField não é renderizada corretamente com crispy_forms usando bootstrap
-
20-12-2019 - |
Pergunta
Estou usando crispy_forms e FormHelper.Eu tenho um campo de modelo declarado como:
active = models.BooleanField(default=True)
E no meu ModelForm, tentei o seguinte no meu Layout:
self.helper.layout = Layout(
...
InlineCheckboxes('active'),
Field('active'),
...
que ambos não fornecem o resultado desejado:
Por favor, veja link da imagem
Ao usar InlineCheckboxes, não vejo a caixa de seleção e usando apenas Field, ela não está formatada corretamente.
Por favor ajude
Solução
Aqui está o link para a seção "Objetos Bootstrap Layout" dos documentos do Crispy Forms.
Caixas de seleção embutidas:Ele renderiza um campo Django Forms.MultipleChoiceField usando caixas de seleção embutidas
InlineCheckboxes não é apropriado para o tipo de campo do seu modelo.
Uma maneira hackeada de conseguir o que você procura é usar PrependedText
com uma string vazia para o text
argumento.
...
PrependedText('active', ''),
...
Examinando a fonte, parece que um campo booleano por padrão renderiza o <input>
etiqueta dentro do <label>
marcação.Usando o hack acima, 'Ativo' permanece no <label>
e a <input>
é colocado onde você esperaria:em um <div>
com classe CSS "controle".Compare o seguinte:
PrependedText('active', '')
:
<div id="div_id_active" class="form-group">
<label for="id_active" class="control-label">Active</label>
<div class="controls">
<div class="input-group">
<input type="checkbox" name="active" class="checkboxinput" id="id_active" />
</div>
</div>
</div>
Field('active')
:
<div class="form-group">
<div id="div_id_active" class="checkbox">
<div class="controls">
<label for="id_active" class=""><input type="checkbox" name="active" class=
"checkboxinput checkbox" id="id_active" /> Active</label>
</div>
</div>
</div>
Atualizar
Eu confirmei que isso foi corrigido no branch dev do django-crispy-forms.
Faça referência a este commit: 5c3a268
E este problema do github: #267