Les processeurs de contexte sont géniaux.
Supposons que vous ayez un modèle d'utilisateur différent et que vous souhaitiez l'inclure dans chaque réponse. Au lieu de faire ceci:
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))
Les processus contextuels vous permettent de transmettre n'importe quelle variable à vos modèles. Je mets généralement le mien dans '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='')
Dans votre, settings.py
ajoutez la ligne suivante à votreTEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
'my_project.apps.core.context.my_context',
...
)
Désormais, chaque fois qu'une demande est faite, elle inclut my_user
automatiquement la clé.
Signale également la victoire.
J'ai écrit un article à ce sujet il y a quelques mois, donc je vais juste copier-coller:
Hors de la boîte Django vous donne plusieurs signaux qui sont incroyablement utiles. Vous avez la possibilité de faire des choses avant et après l'enregistrement, l'initialisation, la suppression ou même lorsqu'une demande est en cours de traitement. Permet donc de s'éloigner des concepts et de montrer comment ils sont utilisés. Disons que nous avons un 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)
Donc, d'une manière ou d'une autre, vous souhaitez informer l'un des nombreux services de ping de blog que nous avons créé un nouveau message, reconstruire le cache des messages les plus récents et tweeter à ce sujet. Eh bien, avec les signaux, vous avez la possibilité de faire tout cela sans avoir à ajouter de méthodes à la 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)
Nous y voilà, en définissant cette fonction et en utilisant le signal post_init pour connecter la fonction au modèle Post et l'exécuter après l'avoir enregistrée.