Django 里面我们通常会通过这样来将结果递交给 Template 页面处理并输出最终结果
| 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
 | from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.template import TemplateDoesNotExist, RequestContext
from django.shortcuts import render_to_response, get_object_or_404
def archive_view(request, year, month, page_num = None):
    posts = Post.objects.filter(date__year = int(year),
            date__month = int(month),
            type = 'post').order_by('-date')
    if page_num:
        current_page = int(page_num)
    else:
        current_page = 1
    link = '/archives/%s/%s' % (year, month)
    page = None
    if len(posts) > 5:
        page = Paginator(posts, 5).page(current_page)
        posts = page.object_list
    return render_to_response('post/archive.html',
                { 'year': year,
                'month': month,
                'posts': posts,
                'page': page,
                'current_page': current_page,
                'link': link},
                context_instance = RequestContext(request)
                )
 | 
这里拿的是来自 Pulog 的 Views.py 里面的一段代码。
Django 的官方文档里面所讲述的做法就是这样的,当然我不是讲这种方法有错,而是我们需要对它进行抽像,好处在于当某天我们需要统一对 Views 到 Templates 中间加入统一的处理的时候可以更方便,不用再从很多代码中一处一处修改。
我在做我的 Coderblogs 的时候曾经是这样做的:
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 | from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.template import TemplateDoesNotExist, RequestContext
from django.shortcuts import render_to_response, get_object_or_404
def _out_page(template,data):
    """
    summary:
        输出页面 HTML,template 的 Response
    params:
        filename    template 文件名
        data    Context 的数据字典
    """
    _template = loader.get_template(template)
    _context = Context(data)
    _output = _template.render(_context)
    return HttpResponse(_output)
def home(request):
    _out_page('home.html',{'name' : 'Jason Lee','sex':'male'})
 | 
但是刚才我在 Django 的 Wiki 里面看到了 更好的做法
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 | from django.shortcuts import render_to_response
from django.template import RequestContext
def render_to(tmpl):
    def renderer(func):
        def wrapper(request, *args, **kw):
            output = func(request, *args, **kw)
            if not isinstance(output, dict):
                return output
            return render_to_response(tmpl, output,
                                      context_instance=RequestContext(request))
        return wrapper
    return renderer
@@render_to('home.html')
def home(request):
    return {'name' : 'Jason Lee','sex':'male'}
 |