如果看过很多的Django的开源项目,发现开始在views.py
中的都是以函数def XXX(request):
的方式做处理。这种是很简单,但是对于OOP思想来讲,这样是有点out-dated了。Django现在更常用的是基于类的视图做处理。
基于类的视图,说起来简单,但是也费劲。我再一一道来,_。
基于类的视图使用
1. urls.py的改变
如果使用的是视图类,那么在url中处理的方法需要改为`XXView.as_views()`。这个相当于是一个入口,初始化一个view类的实例,同时调用dispatch
方法。
2. views.py的改变
你可以继承很多类,但是基本的可以用templateview,但常用的是自己建立一个类(父类是View)。
1). 设定类属性,比如: form_class
、template_name
2). 可以覆盖get、post方法,例如最简单的:
def get(self, request, *args, **kwargs):
form = self.form_class()
return render(request, self.template_name, {'form': form})
3). post方法常常要求一些限制,比如原子操作,或者需已登录:
如果是原子操作,在post方法前使用@transaction.atomic
;
如果是需登录,抱歉,直接将login_required是不行的。正确的做法是重写dispatch方法:
@method_decorator(login_required) def dispatch(self, request, *args, **kwargs): return super(YourView, self).dispatch(request, *args, **kwargs)
4). 返回
- 如果是指定某个界面,使用:
return render(request, self.template_name, {
'form': form,
})
- 如果是重定向到其他页面,使用redirect。使用next是,比如直接点某个界面,但是需要先登录,所以网址会先到登录界面。此时你注意网址的get参数是有next的,表示下一个要去的网址。:
return redirect(request.GET['next'] if 'next' in request.GET else 'home')
结语
当然常常view类是和form类一起使用的(因为提交表单的关系),下一篇会讲使用到的form类。