Django-plus: para que serve?
O django-plus foi uma biblioteca criada com o propósito de oferecer alguns recursos - criados por mim ou não, os códigos contidos nele que não são meus, recebem as devidas indicações ao autor - úteis que não faziam parte do core do Django.
Porque isso? Porque o Django possui uma política de coesão que evita que ele vire um cara gordão cheio de coisas, mas que existem coisas que realmente ajudam bastante em certas tarefas, mas que não justificam a criação de uma aplicação plugável.
Para adicionar a django-plus a seu projeto, você precisa fazer o download em [2] ou ainda em [6] e adicionar ao projeto como uma aplicação qualquer.
Seguem abaixo os recursos da django-plus.
JSONField
Tipo de campo que armazena listas ou dicionários em formato JSON bastante interessante. Foi criado pleo usuário deadwisdom que o colocou no Django Snippets [1].
Exemplo de uso
from djangoplus.fieldtypes import JSONField
class Produto(models.Model):
nome = models.CharField(max_length=50)
lista = JSONField(blank=True)
este campo aceitará listas, dicionários e outros valores serializáveis.
SectionedForm
Baseando num snippet que criei [3], trata-se de uma classe de form que permite dividir o form em fieldsets (da mesma forma que você pode fazer no Admin, por exemplo.
Exemplo de uso
from djangoplus.forms import SectionedForm
class FormProduto(SectionedForm, forms.ModelForm):
class Meta:
model = Produto
fields = ('nome', 'referecia', 'categorias', 'lista',)
fieldsets = (
(None, ('nome','referencia',)),
(_('Outras Informacoes'), ('categorias','lista',)),
)
quando o form for utilizando no template, em forma forma convencional, ele será divido em duas seções, uma sem título e outra chamada "Outras Informacoes". A divisão será feita por um elemento H3, mas você pode customizar isso adicionando o atributo "fieldset_template", exemplo
class FormProduto(SectionedForm, forms.ModelForm):
class Meta:
model = Produto
fields = ('nome', 'referecia', 'categorias', 'lista',)
fieldset_template = '<h2 id="section_%(section)s">%(title)s</h2>'
usando o id gerado por ele (veja o HTML gerado para saber qual), você pode exibir ou ocultar uma seção usando JavaScript.
para mim tem sido muito útil, pois é realmente chato ter formulários longos sem nenhuma divisão ou ter que informar campo por campo por causa delas.
Proteção anti-robôs para e-mails, URLs e outras informações
Baseado no snippet que criei em [4].
Sabe aquela coisa que alguns sites fazem para proteger um e-mail contra spam? exemplo "mari...@gmail.com".
Pois é, essa proteção é para isso. Na verdade eu precisa de uma proteção que valesse para todo tipo de informações, então ao invés de fazer o mesmo com o e-mail (adicionar as reticencias), ele exibe uma frase do tipo "informação confidencial, clique aqui para se certificar de que não é um robô". Aí ele vai para uma página com capcha e tudo resolvido.
Como usar
Adicione o middleware 'djangoplus.middleware.ProtectAntiRobotsMiddleware'
No template onde deseja ocultar uma informação, acrescente
{% load djangoplus_tags %} {% protectantirobots %} <a href="mailto: {{ office.email }}">{{ office.email }}</a> {% endprotectantirobots %}
FakeSessionCookieMiddleware
Criado por Dan Fairs e disponível em [5] este middleware aceita que seja informada a sessão através de um parâmetro na URL. É bastante útil para a criação de integração com Flesh, Ajax, Google Gadgets, Facebook F8, etc.
Para usá-lo, acrescente-o como middleware ao seu projeto 'djangoplus.middleware.FakeSessionCookieMiddleware'
render_to_json
Como o nome indica, funciona de forma semelhante à shortcut render_to_response, mas se destina a responder em formato JSON.
Exemplo de uso
from django.utils import simplejson
from djangoplus.shortcuts import render_to_json
def json_view(request):
ret = {'nome': 'Tarsila', 'idade': 2}
return render_to_json(simplejson.dumps(ret))
render_to_mail
Da mesma forma que a supracitade, renderiza, só que enviando um e-mail. É ainda mais útil para se enviar e-mails do tipo HTML.
Como usar
Se deseja usar formato texto plano, declare a setting
DEFAULT_EMAIL_CONTENT_SUBTYPE = 'plain'Para enviar um e-mail a partir de uma template, use um código como este
from djangoplus.shortcuts import render_to_mail return render_to_mail( 'central/usuarios/mensagem.html', locals(), subject='Titulo da mensagem', recipient_list=['marinho@marinhobrandao.com'], )
DynamicTemplate
Trata-se de um template dinâmico, que é manipulado através do Admin e pode ser acrescentado a um outro template através da template {% dynamic_template %}.
É um recurso poderoso, que pode ser utilizado em grupos, quando todos os templates de um grupo em comum são adicionados em lote.
Como usar
Vá até seu Admin, procure a seção "Djangoplus" e clique na opção "Dynamic templates" e adicione seu template dinâmico;
Em seu template, adicione uma template tag assim
{% load djangoplus_tags %} {% dynamic_template slug-do-template %} {% dynamic_template group grupo-do-template %}
Template filters
E por falar em template tags, o django-plus possui muitos template filters, úteis ou não para o seu caso
{{ numero|multiple_of:3 }} - retorna True se "numero" é multiplo de "3"
{{ valor|in_list:lista }} - retorna True se "valor" está contido em "lista"
{{ valor|is_equal:outro_valor }} - retorna True se "valor" é igual a "outro_valor"
{{ valor|is_not_equal:outro_valor }} - retorna True se "valor" não é igual a "outro_valor"
{{ valor|is_lt:outro_valor }} - retorna True se "valor" é menor que "outro_valor"
{{ valor|is_lte:outro_valor }} - retorna True se "valor" é menor ou igual a "outro_valor"
{{ valor|is_gt:outro_valor }} - retorna True se "valor" é maior que "outro_valor"
{{ valor|is_gte:outro_valor }} - retorna True se "valor" é maior ou igual a "outro_valor"
{{ numero|is_day_of:data }} - retorna True se "numero" é o dia de uma "data"
{{ numero|is_month_of:data }} - retorna True se "numero" é o mês de uma "data"
{{ numero|is_year_of:data }} - retorna True se "numero" é o ano de uma "data"
{{ numero|is_hour_of:data }} - retorna True se "numero" é a hora de uma "data"
{{ numero|is_minute_of:data }} - retorna True se "numero" é o minuto de uma "data"
{{ numero|is_second_of:data }} - retorna True se "numero" é o segundo de uma "data"
{{ data|dec_year:numero }} - decrementa "numero" de anos de uma "data"
{{ data|dec_month:numero }} - decrementa "numero" de meses de uma "data"
{{ data|inc_year:numero }} - incrementa "numero" de anos de uma "data"
{{ data|inc_month:numero }} - incrementa "numero" de meses de uma "data"
{{ lista|list_as_text }} - faz exatamente o mesmo que a template filter join faz hoje (na época da criação ela não existia)
{{ lista|list_as_text:atributo }} - faz o mesmo que acima, porém é baseado no atributo informado
{{ lista|list_as_links:atributo }} - faz o mesmo que a template filter list_as_text, entretanto, monta um link para cada uma delas
{{ variavel|startswith:outro_valor }} - retorna True se a string contida em "variavel" inicia com a contida em "outro_valor"
{{ variavel|endswith:outro_valor }} - retorna True se a string contida em "variavel" termina com a contida em "outro_valor"
{{ queryset|order_by:"campo1,campo2" }} - efetua a ordenação de uma queryset
Bom, há ainda alguns widgets, generic views, utilidades para Google Maps API e e o mais importante Model Info (para objeto e para listagem), que equivale ao ModelForm, porém exibe somente as informações para visualização. Entretanto, por hoje vamos ficar por aqui, logo eu publico a segunda parte :)
- http://www.djangosnippets.org/snippets/377/
- http://code.google.com/p/django-plus/source/checkout
- http://www.djangosnippets.org/snippets/798/
- http://www.djangosnippets.org/snippets/742/
- http://www.stereoplex.com/two-voices/cookieless-django-sessions-and-authentication-without-cookies
- http://django-plus.googlecode.com/files/django-plus-1.0-stable.tar.gz
Marinho Brandão
comentou há 2 months, 2 weeks:
Poxa Marinho, muito boa a coletânea hein! Realmente muito bom, vlw!
Tkm