No framework Django um widget é a representação de um elemento de entrada HTML. O Widget lida com a prestação do HTML, e a extração de dados a partir de um dicionário que corresponde ao widget. Os Widgets não devem ser confundidos com os campos do formulário. Os campos do formulário lidam com a lógica de validação de entrada e são usados diretamente em modelos. Já os Widgets lidam com processamento de elementos de entrada de um formulário HTML na página web e na extração dos dados brutos apresentados. No entanto, os widgets não precisam ser atribuídos para formar campos, isto quer dizer que os campos de um formulário geram os elementos HTML básicos e um Widget pode ser atribuído ao campo para formar um componente visual mais avançado.
Widgets: https://docs.djangoproject.com/en/1.7/ref/forms/widgets/
Utilizando elementos e Widgets
Crie um projeto e uma aplicação Django, configure o banco de dados e a rota para sua visão adequadamente. Utilize os arquivos abaixo para os respectivos arquivos para o Model, View, Template e o Form:
Exemplo:
Neste exemplo criamos uma aplicação Django que utiliza um formulário de cadastro que utiliza elementos e Widgets que estão ligados em um modelo e são exibidos através de um Template.
Python
Model.py
from django.db import models # Cria modelo class Funcionario (models.Model): nome = models.CharField(max_length=30) sobrenome = models.CharField(max_length=50) cargo = models.CharField(max_length=50) data = models.DateField() salario = models.DecimalField(max_digits=19, decimal_places=10) genero = models.CharField(max_length=30) ativo = models.BooleanField() observacao = models.CharField(max_length=255) # Define unicode para o Django Admin def __unicode__(self): return self.nome
View.py
from django.shortcuts import render, render_to_response, RequestContext from django.http import HttpResponse # Importa form from meusite.forms import MeuForm # Exibe View def home(request): # Cria form form = MeuForm(request.POST or None) # Valida e salva if form.is_valid(): salvar = form.save(commit=False) salvar.save() return HttpResponse("Dados inseridos com sucesso!") # Chama Template return render_to_response("devaberto.html", locals(), context_instance = RequestContext(request))
Template – devaberto.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Desenvolvimento Aberto</title> <style> body { font-family: "Times New Roman", Times, serif; font-size: 12px; } </style> </head> <body> <h1>Desenvolvimento Aberto - Django - Elementos - Widgets </h1> <form method="post" action=""> <fieldset> <legend> Cadastro: </legend> {% csrf_token %} <table> <td> {{ form.as_table }} </td> </table> <hr /> <input type="submit" /> </fieldset> </form> </body> </html>
Form.py
from django import forms from django.forms import extras from django.core.validators import RegexValidator # Importa modulo Regex import re # cria objeto Regex caracteres = RegexValidator( # regex= re.compile(r"[a-zA-Z]+"), regex=r"[a-zA-Z]+", message="Permitido somente caracteres Alpha numericos", code="invalid") # Importa modelo from models import Funcionario # Cria classe do form para o modelo class MeuForm(forms.ModelForm): # Cria Conteudo GENEROS = (("Masculino", "Masculino"), ("Feminino", "Feminino")) CARGOS = (("Vocalista", "Vocalista"), ("Guitarrista", "Guitarrista"), ("Baixista", "Baixista"), ("Baterista", "Baterista")) # Define Widgets nome = forms.CharField(required=True, validators=[caracteres]) sobrenome = forms.CharField(required=True, validators=[caracteres]) cargo = forms.ChoiceField (required=True, widget=forms.Select, choices=CARGOS) data = forms.DateField(required=True, widget=forms.extras.SelectDateWidget) salario = forms.DecimalField(required=True) genero = forms.ChoiceField (required=True, widget=forms.RadioSelect, choices=GENEROS) ativo = forms.BooleanField() observacao = forms.CharField(widget=forms.Textarea) # Associa formulario ao modelo class Meta: model = Funcionario # Django Validations - customizado campo sobrenome def clean_sobrenome(self): snome = self.cleaned_data['sobrenome'] if len(snome) <= 3: raise forms.ValidationError("Sobrenome precisa conter mais de 3 caracteres.") return snome