12
Jul

Utilizando widgets do newforms-admin

Uma pergunta que frequentemente é feita na lista ou no canal (#django-br) da comunidade Django brasileira e quase sempre não é respondida é: 'Como utilizar o widget de data do admin do Django em um formulário normal?'.



O admin do Django é uma das ferramentas mais espetaculares do framework, e um dos motivos disso são seus belos widgets. Um dos principais widgets é o widget para datas. Esse campo trabalha com datas de uma forma bacana, sem contar com o calendário que vem com ele.



Mas, voltando à pergunta, é possível sim utilizar esse widget, e se estiver utilizando o branch do newforms-admin isso é muito fácil.



Para demonstrar isso através da prática, iremos precisar de um model. Para isso vamos criar um model Noticia, para um sistema de notícias onde seus campos seriam: titulo, conteúdo e data:




class Noticia:
titulo = models.CharField(max_length=255)
conteudo = models.TextField()
data = models.DateTimeField()


Agora vamos criar um formulário para cadastrar as notícias. Eu geralmente gosto de criar um arquivo chamado forms.py onde eu coloco as classes responsáveis pelos meus formulários.



Eu vou criar um formulário utilizando o ModelForm que gera um formulário a partir de um model. E irei sobrescrever o campo data, configurando ele para utilizar o widget de data do newforms-admin.



É preciso também, importar as classes e métodos necessário para utilizar o newforms, ModelForm e as classes referentes ao widget que vamos utilizar.




from django.newforms import ModelForm
from django import newforms as forms
from django.contrib.admin.widgets import AdminDateWidget

from models import *

class NoticiaForm(ModelForm):

data = forms.DateTimeField(widget=AdminDateWidget())

class Meta:
model = Noticia


Vamos então criar uma view que enviará para uma template o nosso formulário.




from django.shortcuts import render_to_response

from forms import *

def index(request):
form = NoticiaForm()
return render_to_response('index.html', {'form':form})


Agora vamos criar a template que exibirá nosso formulário, lembrando de importar os javascripts e arquivos css necessários para exibir o widget de data corretamente.




<html>
<head>
<link rel="stylesheet" type="text/css" href="/admin_media/css/base.css" />
<link rel="stylesheet" type="text/css" href="/admin_media/css/forms.css" />
<link rel="stylesheet" type="text/css" href="/admin_media/css/widgets.css" />
<script type="text/javascript" src="/admin/jsi18n/"></script>
<script src="/admin_media/js/core.js"></script>
<script src="/admin_media/js/dateparse.js"></script>
<script src="/admin_media/js/timeparse.js"></script>
<script src="/admin_media/js/calendar.js"></script>
<script src="/admin_media/js/admin/DateTimeShortcuts.js" type="text/javascript"></script>
</head>
<body>
{{ form.as_p }}
</body>
</html>


E finalmente vamos configurar as urls.




from django.conf.urls.defaults import *
from noticias.views import *
from django.contrib import admin

urlpatterns = patterns('',

(r'^$', index),
('^admin/(.*)', admin.site.root),
)


Lembrando que para o widget funcionar corretamente é preciso que o admin esteja adicionado nas INSTALED_APPS no arquivo settings.py do seu projeto e que o admin esteja adicionado no urls.py.



Para não ter erro estou adicionando um arquivo compactado com um projeto exemplo para vocês fazerem o download.