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


