以demo
app为例。
view的一般步骤
1. 构造 Context
,这是给模板传值的变量
2. 返回一个以模板构造生成的页面
用 render
还是用 render_to_response
render() 结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
render() 与以一个强制使用RequestContext的context_instance 参数调用render_to_response() 相同。
所以,如果使用 render
from django.shortcuts import render def view1(request): context = {'hello', 'Hello The World!'} return render(request, 'demo/hello.html', context)
如果使用 render_to_response
from django.shortcuts import render_to_response from django.template import RequestContext def view2(request): context = RequestContext() context.push({'hello', 'Hello The World!'}) return render_to_response('demo/hello.html', context)
需要好好比较一下差异。
@装饰器
在一些view里我们经常要做一些重复性的工作,如判断是否已登录,否则跳转到登录页面,这些操作都必须在开始功能代码前进行,那我们就可以用 @装饰器
来减少代码。
from django.shortcuts import redirect from django.shortcuts import resolve_url def view1(request): reporter_is_login = request.session.get('_se_reporter_is_login', False) # 非登录状态的轩到登录页面 if not reporter_is_login: resolved_login_url = resolve_url('demo:login') return redirect(resolved_login_url) # 以下功能代码 ....
view2
, view3
的前端也都是这样的操作,那么我们用装饰器来实现
在 demo
app目录下创建文件 decorator,py
from django.shortcuts import redirect from django.shortcuts import resolve_url import functools def demo_login_required(reporter_login_url='demo:login'): # 报修未登录跳转到登录页面的装饰器 def decorator(func): @functools.wraps(func) def wrapper(request, *args, **kwargs): reporter_is_login = request.session.get('_se_reporter_is_login', False) # 非登录状态的轩到登录页面 if not reporter_is_login: resolved_login_url = resolve_url(reporter_login_url) return redirect(resolved_login_url) return func(request, *args, **kwargs) # 对应wrapper的参数 return wrapper return decorator
然后我们在需要做登记判断的 view
前加上装饰器,如修改 view1
from demo.decorator import demo_login_required @demo_login_required def view1(request): # 以下功能代码 ....