Los procesadores de contexto son increíbles.
Supongamos que tiene un modelo de usuario diferente y desea incluirlo en cada respuesta. En lugar de hacer esto:
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))
Los procesos de contexto le brindan la posibilidad de pasar cualquier variable a sus plantillas. Normalmente pongo el mío en'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='')
En tus settings.py
agregar la siguiente línea a suTEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
'my_project.apps.core.context.my_context',
...
)
Ahora, cada vez que se realiza una solicitud, incluye la my_user
clave automáticamente.
también señala victoria.
Escribí una publicación de blog sobre esto hace unos meses, así que voy a cortar y pegar:
Fuera de la caja, Django te da varias señales que son increíblemente útiles. Tiene la capacidad de hacer cosas antes y después de guardar, iniciar, eliminar o incluso cuando se procesa una solicitud. Entonces, alejémonos de los conceptos y demostremos cómo se usan. Digamos que tenemos 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)
Entonces, de alguna manera, desea notificar a uno de los muchos servicios de ping-blog que hemos hecho una nueva publicación, reconstruir el caché de publicaciones más recientes y twittear al respecto. Bueno, con las señales tienes la capacidad de hacer todo esto sin tener que agregar ningún método a la clase 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)
Ahí vamos, definiendo esa función y usando la señal post_init para conectar la función al modelo Post y ejecutarla después de que se haya guardado.