Django中类视图的使用

2016-04-24  本文已影响564人  slowrabbit

如果看过很多的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_classtemplate_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,
        })
return redirect(request.GET['next'] if 'next' in request.GET else 'home')

结语

当然常常view类是和form类一起使用的(因为提交表单的关系),下一篇会讲使用到的form类。

上一篇 下一篇

猜你喜欢

热点阅读