Esta semana saiu o Django 1.2 e dentre as novidades desta versão estão recursos como o suporte a múltiplos bancos de dados, a validação dos Django Models, baseada na validação dos Django Forms, um framework para mensagens e uma nova versão da template-tag if. Existem ainda alguns outros recursos, mas vamos dar uma olhada nesses quatro anteriores com mais atenção…
1. Suporte ao uso de vários bancos de dados: Como o nome indica, agora é possível utilizar vários bancos de dados no Django. Isso significa que a configuração do banco de dados no arquivo settings.py não acontece mais da mesma forma. Cada configuração de banco de dados é batizada com um nome, e tem seus próprios parâmetros e na hora de executar alguma tarefa no banco de dados, você especifica qual banco de dados deseja utilizar ao executar uma query através do método using da classe QuerySet, já na hora de gravar registros no banco de dados, você utiliza o parâmetro using para informar qual banco de dados utilizar. Não entendeu? Que tal um pouco de código?
Com Django 1.1:
1 2 3 4 5 6 | DATABASE_ENGINE = 'sqlite3' DATABASE_NAME = 'dados.db' DATABASE_USER = '' DATABASE_PASSWORD = '' DATABASE_HOST = '' DATABASE_PORT = '' |
Agora, utilizando o Django 1.2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'dados.db', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', }, 'alternative' : { 'ENGINE' : 'django.db.backends.mysql', 'NAME' : 'dados', 'USER' : 'root', 'PASSWORD' : '', 'HOST' : 'localhost', 'PORT' : '3306', } } |
Note que configuramos dois bancos de dados, inclusive de tipos diferentes: um SQLite3, que identificamos como default e um MySQL, que identificamos como alternative.
Existem recursos mais “avançados”, como o roteamento automático do banco de dados (utilizar um banco de dados apenas para leitura e outro apenas para escrita, por exemplo), que podem ser conferidos na documentação oficial do Django.
2. Validação de modelos e introdução de validators: Agora os modelos são capazes de se auto-validar-se a si mesmos e suporte à construção de validadores personalizados (recomendo não usar esse termo jamais =P custom validators soa bem melhor), que são configurados diretamente nos Models ou nos Forms.
Os novos validators do Django funcionam de forma semelhante aos validators do WTForms, que abordei no blogpost anterior. Assim, recomendo a leitura do blogpost de integração do WTForms com o Pylons para ver um pouco mais dos validators.
Entendendo um pouco mais da validação de modelos, podemos criar um modelo qualquer e definir o validate_even (que valida se um número é par). Assim, vamos configurar nosso model para aceitar somente números pares em um de seus fields. Um validator nada mais é do que uma função que recebe um parâmetro e valida ele (!):
1 2 3 4 5 | from django.core.exceptions import ValidationError def validate_even(value): if value % 2 != 0: raise ValidationError(u'%s não é um número par.' % value) |
E no nosso model nós simplesmente passamos o objeto validate_even dentro de uma lista para o parâmetro validators:
1 2 3 4 | from django.db import models class MyModel(models.Model): even_field = models.IntegerField(validators=[validate_even]) |
Atenção: a validação dos objetos deve ser feita de forma explícita. O método save não executa a validação implicitamente.
3. Framework de mensagens: O Django agora inclui um framework poderoso e personalizável para envio de mensagens, utilizadas em três níveis: info, warning e error. A configuração do framework de mensagens é um pouco mais trabalhosa, então recomendo fortemente a leitura da documentação oficial.
4. Nova template-tag “if”: O Django 1.2 trouxe uma melhoria na template tag if, que agora tornou-se mais poderosa. Esta melhoria pode ser um pouco polêmica, uma vez que facilita a implementação de lógica no template. A ideia aqui é substituir templates tags como ifequal e ifnotequal, além de introduzir o suporte ao uso de template filters com a tag if. Vamos ver um pouco de código…
No Django 1.1:
1 2 3 | {% ifnotequal a b %} ... {% endifnotequal %} |
No Django 1.2:
1 2 3 | {% if a != b %} ... {% endif %} |
Ambos os códigos comparam se duas variáveis (a e b) são diferentes. A nova template tag trouxe o suporte ao uso de operadores, como demonstrado no exemplo acima, e também ao uso de template filters, como demonstrado abaixo:
1 2 3 4 5 | <div {% if user.email|lower == message.recipient|lower %} class="highlight" {% endif %} >{{ message }}</div> |
O código acima compara se dois objetos são equivalentes, mas antes da comparação, converte ambos para minúsculo utilizando o template filter lower.
Existem diversos outros recursos, como template caching, e-mail backends, melhorias no sistema de autenticação e autorização, dentre outras. Para mais detalhes, confira as notas de lançamento do Django 1.2 e a documentação oficial.

Pingback: Tweets that mention O que muda com o Django 1.2? | Francisco Souza -- Topsy.com
Muito bom ficou o Django com estas novidades.
Eu já havia dado uma olhada nelas, mas agora que foi liberado mesmo vou colocá-las em pratica no meu projeto !
Valeu…
Muito bom o artigo.
Também é interessante ressaltar as inúmeras melhorias no setor de internacionalização e localização ( http://docs.djangoproject.com/en/1.2/topics/i18n/localization/#format-localization ), criação de campos BigInt, GeoDjango com backends pra bancos geoespaciais, permissão em nível de objetos :)
Se tiver com tempo e souber inglês, tem o http://www.djangoadvent.com que “explica” a maioria das mudanças do 1.2