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'}
|