Os processadores de contexto são impressionantes.
Digamos que você tenha um modelo de usuário diferente e deseje incluí-lo em todas as respostas. Em vez de fazer isso:
def myview(request, arg, arg2=None, template='my/template.html'):
''' My view... '''
response = dict()
myuser = MyUser.objects.get(user=request.user)
response['my_user'] = myuser
...
return render_to_response(template,
response,
context_instance=RequestContext(request))
Os processos de contexto permitem passar qualquer variável para seus modelos. Eu normalmente coloco o meu em 'my_project/apps/core/context.py
:
def my_context(request):
try:
return dict(my_user=MyUser.objects.get(user=request.user))
except ObjectNotFound:
return dict(my_user='')
No seu, settings.py
adicione a seguinte linha ao seuTEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
'my_project.apps.core.context.my_context',
...
)
Agora, toda vez que uma solicitação é feita, ela inclui a my_user
chave automaticamente.
Escrevi um post sobre isso há alguns meses, então vou apenas recortar e colar:
O Django fornece diversos sinais que são incrivelmente úteis. Você tem a capacidade de fazer as coisas antes e depois de salvar, iniciar, excluir ou mesmo quando uma solicitação está sendo processada. Então, vamos nos afastar dos conceitos e demonstrar como eles são usados. Digamos que temos um blog
from django.utils.translation import ugettext_lazy as _
class Post(models.Model):
title = models.CharField(_('title'), max_length=255)
body = models.TextField(_('body'))
created = models.DateTimeField(auto_now_add=True)
Então, de alguma forma, você deseja notificar um dos muitos serviços de ping de blogs que criamos uma nova postagem, reconstruir o cache de postagens mais recentes e twittar sobre ela. Bem, com sinais, você tem a capacidade de fazer tudo isso sem precisar adicionar nenhum método à classe Post.
import twitter
from django.core.cache import cache
from django.db.models.signals import post_save
from django.conf import settings
def posted_blog(sender, created=None, instance=None, **kwargs):
''' Listens for a blog post to save and alerts some services. '''
if (created and instance is not None):
tweet = 'New blog post! %s' instance.title
t = twitter.PostUpdate(settings.TWITTER_USER,
settings.TWITTER_PASSWD,
tweet)
cache.set(instance.cache_key, instance, 60*5)
# send pingbacks
# ...
# whatever else
else:
cache.delete(instance.cache_key)
post_save.connect(posted_blog, sender=Post)
Lá vamos nós, definindo essa função e usando o sinal post_init para conectar a função ao modelo Post e executá-la depois que ela foi salva.