Question

Like a good little coder, all of my Django templates inherit from a base.html. Now I would like to add some functionality to the base to always show some interesting things. Some user statistics, or random posts, or feeds, etc.

All of my views look like this:

def viewname(request) :
    template_vales = {}
    // Stuff
    return render_to_response('some_file_name.html', template_values)

How can I make it so that the values of template_values are always populated for all my views? Do I have to do this at the start of all of my views? As in:

import utils

def viewname(request) :
    template_values = {}
    utils.addDefaults(template_values)
    // Stuff
    return render_to_response('some_file_name.html', template_values)

Or is there a better way?

Was it helpful?

Solution

You should use context processors:

http://docs.djangoproject.com/en/dev/ref/templates/api/

http://www.b-list.org/weblog/2006/jun/14/django-tips-template-context-processors/

In my settings.py, I add a couple of functions to the standard ones (see the last two):

TEMPLATE_CONTEXT_PROCESSORS = (
  "django.core.context_processors.request",
  "django.core.context_processors.auth",
  "django.core.context_processors.debug",
  "django.core.context_processors.i18n",
  "thetrailbehind.context_processors.canonical_url",
  "thetrailbehind.context_processors.gmapkey",)

The first one I add defines the canonical URL for the view, and the second switches between GMap keys. Here's that function:

def gmapkey(request):
  url = request.META['HTTP_HOST']
  key = ""
  if url == "127.0.0.1:8000":
    key = "ABQIAAAAGFSvsJjnPmsGb7IcfqoamBTpH3CbXHjuCVmaTc5MkkU4wO1RRhTaJZRNQLjBhGtJlm6eE4gJtku-Rw"   
  elif url ==  "192.168.11.3:8000":
    key = "ABQIAAAAGFSvsJjnPmsGb7IcfqoamBTm8-wcGRt2V-0p00qdRdGeyDhtGBSRTbk2s1ciA8vzdxGeAnqq6g-F4g"
  elif url ==  "192.168.11.17:7000":
    key="ABQIAAAAmHGaJpkZhJ6huJ93yfaYERTmT93Y0kqi8UE3J2QowoLz6rHdtxTHqeJ0nRoENl5LY5gCqHhRK9Yasg"
  elif url == "192.168.1.200:8000":
    key="ABQIAAAAmHGaJpkZhJ6huJ93yfaYERR5_sKpsr8Ui4YjC4HGOe8xaUDeVhSxGV1r1rIL1OvmVMAGUQBoUK0H2w"
  elif url == "192.168.1.73:8000":
    key = "ABQIAAAAGFSvsJjnPmsGb7IcfqoamBR7_CRKSBu49YjvDOLq_-DZQHSIYBSip9sO5IHlFIoZMtDpVcduFQCnWg"
  elif url == "www.trailbehind.com":
    key="ABQIAAAAGFSvsJjnPmsGb7IcfqoamBQxFGSDsNggDdRtUnAb8L8sJ910FhSKwoOpNaUlGCQIhyl6Dy5Cbyb0lQ"
  elif url == "dev.trailbehind.com":
    key="ABQIAAAAmHGaJpkZhJ6huJ93yfaYERQzqIbhF_xOwOwM1oDO_kQqYhag7BRsoTInq2lBuE7fsgDN2xfyD2IL5A"
  elif url == "trailbehind.com":
    key = "ABQIAAAAGFSvsJjnPmsGb7IcfqoamBQL9YYTGyB2pLTiscy54DOfsaXeHBQqMBmq7UvWAZVenmRMtNr_bo3TMQ"
  elif url == "tenuki.trailbehind.com":
    key = "ABQIAAAAGFSvsJjnPmsGb7IcfqoamBQ5SkJUKVREyqcvaNQJsRscGi2yVhSj0mJSTasDiWec8Awxb_TUxOdElw"
  elif url == "cabin.trailbehind.com":
    key = "ABQIAAAAmHGaJpkZhJ6huJ93yfaYERSU-76xxg1tvy-8taAiiF1qqcGi1xSmjUhmAs_v2XAuGxKX_Y-4-gDP3Q"
  elif url == "ec2-174-129-167-234.compute-1.amazonaws.com":
    key = "ABQIAAAAmHGaJpkZhJ6huJ93yfaYERStHq7nubctzsNDgkYc34LoSNrRNhQVCNy2KFFm2BT1sG2yrXrw38ycNg"

OTHER TIPS

For this I use context processors. For example, if I want get variable MEDIA_URL for each view, I define context_processors.py like this:

def media_url(request):
    from django.conf import settings
    return {'MEDIA_URL': settings.MEDIA_URL}

in settings.py you must have

TEMPLATE_CONTEXT_PROCESSORS = (
    ....
    'django.core.context_processors.request',
    'myaplication.context_processors.menuitems',
)

in view you must have render_to_response and context_instance=RequestContext(request) For example:

def my_view(request):
return render_to_response('base.html',{},
                              context_instance=RequestContext(request))
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top