This view decorator renders automaticaly the template with the context provided both by the view "return" statement. For example:
@auto_render
def my_view(request):
...
return 'base.html', locals()
You can still return HttpResponse and HttpResponseRedirect objects without any problems. If you use Ajax requests, this decorator is even more useful. Imagine this layout:
def aggregating_view(request):
...
context = locals()
partial1 = partial_view_1(request, only_context=True)
partial2 = partial_view_2(request, only_context=True)
# aggregate template include partial templates
return 'aggregate.htmt', context.update(partial1).update(partial2)
def partial_view_1(request):
...
return 'partial_1.html', locals()
def partial_view_2(request):
...
return 'partial_2.html', locals()
This way you can render you view individualy for specific ajax calls and also get their context for the aggregating view.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContext
def auto_render(func):
"""Decorator that automaticaly call the render_to_response shortcut.
The view must return a tuple with two items : a template filename and the desired context.
HttpResponse object could be also returned. it's possible to override the default
template filename by calling a decorated view with an "template_name" parameter
or to get only the context dictionary via "only_context" parameter.
>>> from utils.utils import auto_render
>>> @auto_render
... def test(request):
... return 'base.html', {'oki':1}
...
>>> from django.http import HttpRequest, HttpResponse
>>> response = test(HttpRequest())
>>> assert type(response) is HttpResponse
>>> response = test(HttpRequest(), only_context=True)
>>> assert response['oki'] == 1
>>> try:
... response = test(HttpRequest(), template_name='fake_template.html')
... except Exception, e:
... e.message
'fake_template.html'
"""
def _dec(request, *args, **kwargs):
if kwargs.get('only_context', False):
# return only context dictionary
del(kwargs['only_context'])
response = func(request, *args, **kwargs)
if isinstance(response, HttpResponse) or isinstance(response, HttpResponseRedirect):
raise Except("cannot return context dictionary because a HttpResponseRedirect as been found")
(template_name, context) = response
return context
if kwargs.get('template_name', False):
overriden_template_name = kwargs['template_name']
del(kwargs['template_name'])
else:
overriden_template_name = None
response = func(request, *args, **kwargs)
if isinstance(response, HttpResponse) or isinstance(response, HttpResponseRedirect):
return response
(template_name, context) = response
if overriden_template_name:
template_name = overriden_template_name
return render_to_response(template_name, context, context_instance=RequestContext(request))
return _dec
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 10 months, 1 week ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 10 months, 2 weeks ago
- Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
- Help text hyperlinks by sa2812 1 year, 6 months ago
Comments
Please login first before commenting.