Um formulário dinâmico é aquele que o usuário pode definir quais campos vão existir. O programador não precisa criar código para cada formulário.
Imagine um sistema que necessite de diversos tipos de formulários. Tarefa no mínimo entediante para o responsável pela manutenção. E se o usuário puder criar e modificar um formulário por uma interface gráfica fácil de usar? Seria muito bom para o programador!
O segredo desse dinamismo é o uso de metaclasses, que são classes cujas instâncias também são classes.
O truque é criar em tempo de execução uma metaclasse da classe forms.Form. Atributos dos campos como label, tipo, max length etc, podem ficar armazenados no banco de dados. Os valores dos campos podem ficar em outra tabela com uma referência de chave estrangeira. Usando o ORM do Django é muito simples, e de quebra já ganha uma interface gráfica para administrar tudo (admin).
Sendo assim, o usuário poderia montar os campos do formulário definindo um label, tipo de campo, se é obrigatório ou não, valor padrão… e essas informações ficarão no armazenadas no BD. Fica fácil criar um código para pegar essas informações, criar uma nova classe Form em tempo de execução, instância-la e renderizar no template.
Exemplo:
# views.py from django.views.generic.simple import direct_to_template from django.forms import forms, fields def montar_formulario_dinamico(request): campos_dinamicos = { 'nome': fields.CharField(max_length=100, required=True, label='Nome', initial='Gustavo'), 'idade': fields.IntegerField(label='Idade', min_value=0), 'email': fields.EmailField(max_length=200, required=False, label='E-mail') } FormDinamico = type('', (forms.Form,), campos_dinamicos) form = FormDinamico() return direct_to_template(request, 'formulario.html', extra_context={'formulario': form})
Fica a dica!















Posted in
Tags: 