Esses dias precisei de modificar a exibição de um radio select na template do Projeto Galileu, bem por causa do css do template, por default o framework django monta assim as suas RadioSelect:
1 2 3 4 5 6 7 8 | <ul> <li> <label for="id_tipo_0"><input checked="checked" name="tipo" value="1" id="id_tipo_0" type="radio" class="required" /> Despesa</label> </li> <li> <label for="id_tipo_1"><input value="2" type="radio" class="required" name="tipo" id="id_tipo_1" /> Receita</label> </li> </ul> |
Acontece que eu preciso de remover essas tags (
Meu forms.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # aqui importamos o radiofieldrenderer que será usado para customizarmos nossa renderização from django.forms.widgets import RadioFieldRenderer # importamos esse utilitário pois sem ele os campos são exibidos como String no HTML ou seja ele não apareceram como radio próriamente dito mais sim escritos o código em string, aff deixe pra lá se queiser ver como é mande retornar sem essa função :) from django.utils.safestring import mark_safe # sem comentarios aqui você já deve saber o que é isso Tipo_Choices = ( ('1', 'Despesa'), ('2', 'Receita'), ) # aqui é a classe que vamos customizar nossa renderização class MyRenderer(RadioFieldRenderer): def render(self): # essa função retorna o nosso radio sem as UL e LI mas aqui você pode fazer outras customizações basta apenas inserir o que quiser aqui, veja abaixo um exemplo usando <br> # return mark_safe(u'<br />\n'.join([unicode(choice) for choice in self])) # entendeu o sentido da coisa ? bem aqui vou deixar por tua conta então faça o que achar melhor :) return mark_safe(u'\n%s\n' % u'\n'.join([u'%s' % w for w in self])) class PlanoContaForm(ModelForm): id = IntegerField(required=False,widget=HiddenInput()) username = IntegerField(required=True, widget=HiddenInput()) # aqui só fique atento para a parte do renderer=MyRenderer que você deve declara a classe que você criou acima o resto é basicão tipo = ChoiceField(widget=RadioSelect(attrs={'class':'required'}, renderer=MyRenderer), choices=Tipo_Choices, initial="1") nome = CharField(widget=TextInput(attrs={'class':'textInput required'}), required=True) |
Para o Html declare o field normalmente apenas fazendo {{ field }}, apenas um exemplo de como está o meu template:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | {% for field in form %}
{% ifequal field.html_name "tipo" %}
<div class="ctrlHolder">
<p class="label">Tipo</p>
<div class="multiField">
{{ field }}
</div>
</div>
{% else %}
<div class="ctrlHolder">
{% if not field.is_hidden %}
{{field.label_tag}}
{% endif %}
{{field}}
</div>
{% endifequal %}
{% endfor %} |
Essa classe renderer serve para outros tipos de widgets como Select, MultipleSelect, etc é só dar uma pequena adaptada.
Já tava me esquecendo o resultado disso aí tudo acima fica assim:
1 2 | <label for="id_tipo_0"><input checked="checked" name="tipo" value="1" id="id_tipo_0" type="radio" class="blockLabel" /> Despesa</label> <label for="id_tipo_1"><input value="2" type="radio" class="blockLabel" name="tipo" id="id_tipo_1" /> Receita</label> |