Ticket #12329: template_v2.py

File template_v2.py, 1.6 KB (added by gurunars, 6 years ago)

Modified "template" decorator. Now uses RequestContext instead of standard Context

Line 
1#Idea and implementation by Anton Berezin
2
3from django.http import HttpResponse, HttpRequest
4from django.template import loader
5from django.template import RequestContext
6import re #regexp
7
8
9#The response object that can hold the context
10class HttpResponseHolder(HttpResponse):
11    context = {} #make sure that it is a dictianory
12
13
14#Adds a template to a view, uses context processors
15class template(object):
16
17    def __init__(self, template_name = None):
18        self.template_name = template_name
19
20    def __call__(self, function):
21        def function_wrapper(request, *args, **kwargs):
22            return_val = function(request, *args, **kwargs)
23            #get a proper template name
24            if self.template_name == None: #if template name is not defined derive it from package name and view function name
25                array = re.split("\.", function.__module__) #split into array with elements like [0]=project_name, [1]=package_name, [2]=file_name (where the function lives)
26                package_name = array[1]
27                self.template_name = "%s/%s.html" %(package_name, function.__name__)
28            #compose the response
29            template = loader.get_template(str(self.template_name))
30            if isinstance(return_val, HttpResponseHolder):
31                return HttpResponse(template.render(RequestContext(request, return_val.context)))
32            elif isinstance(return_val, dict):
33                return HttpResponse(template.render(RequestContext(request, return_val)))
34            elif isinstance(return_val, HttpResponse):
35                return return_val
36            else:
37                return
38        return function_wrapper
Back to Top