保持清醒,不断思考。

Mike lucis


  • 首页
  • 归档
  • 分类
  • 标签
  • 关于
  • 联系
  •     

© 2023 Mike lucis

Theme Typography by Makito

Proudly published with Hexo

备案号: 湘ICP备2021005917号-1

友情链接: Lonely's Bolg

ღゝ◡╹)ノ♡

Django基于类的视图策略

发布于 2021-02-09 Django  Django 框架 视图 

¶ Django基于类的视图策略


django

在这篇文章中,我们将详细探讨 Django 中基于类的视图(简称 CBV )。

我们将重构⼀些现有的视图,以便利⽤内置的基于类的通⽤视图( Generic Class-Based Views )。

¶ 视图策略

所有的Django视图其实都是函数。即便是 CBV。在类的底层,它完成了所有的功能并最终返回⼀个视图函数。

引⼊基于类的视图,使开发⼈员可以更轻松地重新使⽤和扩展视图。使⽤它们有很多好处,例如可扩展性,多重继承之类的⾯向对象技术的运⽤,HTTP ⽅法的处理是在单独的⽅法中完成的,⽽不是使⽤条件分⽀,并且还有通⽤的基于类的视图(简称 GCBV )。

重点条目:

  • 基于函数的视图(FBV)
  • 基于类的视图(CBV)
  • 基于类的通用视图(GCBV)

**FBV**是Django视图中最简单的表示:它就是⼀个接收 HttpRequest 对象并返回⼀个 HttpResponse 的函数。

**CBV**是每个Django视图都被定义为⼀个扩展 django.views.generic.view抽象类后的 Python 类。

**GCBV**是可以解决⼀些具体问题的内置的 CBV 集合,⽐如列表视图,创建,更新和删除视图等。

下面是一些不同实现方式的例子。

¶ 基于函数的视图(FBV)

¶ views.py

1
2
3
4
5
6
7
8
9
def new_post(request):
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
form.save()
return redirect('post_list')
else:
form = PostForm()
return render(request, 'new_post.html', {'form': form})

¶ urls.py

1
2
3
urlpatterns = [
url(r'^new_post/$', views.new_post, name='new_post'),
]

¶ 基于类的视图(CBV)

CBV 是View 类的集成类。这⾥的主要区别在于请求是以 HTTP ⽅法命名的类⽅法内处理的,例如GET ,POST ,PUT ,HEAD 等。

所以,在这⾥,我们不需要做⼀个条件来判断请求是⼀个 POST 还是它是⼀个 GET 。代码会直接跳转到正确的⽅法中。在 View 类中内部处理了这个逻辑。

¶ views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
from django.views.generic import View

class NewPostView(View):
def post(self, request):
form = PostForm(request.POST)
if form.is_valid():
form.save()
return redirect('post_list')
return render(request, 'new_post.html', {'form': form})

def get(self, request):
form = PostForm()
return render(request, 'new_post.html', {'form': form})

¶ urls.py

1
2
3
urlpatterns = [
url(r'^new_post/$', views.NewPostView.as_view(), name='new_post'),
]

在这⾥,我们需要调⽤ as_view() 这个类⽅法,它将返回⼀个符合 url模式视图函数 。在某些情况下,我们也可以将⼀些键字参数传递给 as_view() ,以便⾃定义 CBV 的⾏为,就像我们⽤⼀些身份验证视图来定制模板⼀样。

总之,关于 CBV 的好处是我们可以在类⾥⾯添加更多的⽅法,也许可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from django.views.generic import View

class NewPostView(View):
def render(self, request):
return render(request, 'new_post.html', {'form': self.form})

def post(self, request):
self.form = PostForm(request.POST)
if self.form.is_valid():
self.form.save()
return redirect('post_list')
return self.render(request)

def get(self, request):
self.form = PostForm()
return self.render(request)

还可以创建⼀些通⽤视图来完成⼀些任务,以便我们可以在整个项⽬中重复利⽤它。

¶ 基于类的通用视图(GCBV)

接下来关于 GCBV。这是⼀个不同的视图。正如我前⾯提到的, GCBV 是内置 CBV 的常⻅⽤例。它们的实现往往会⼤量使⽤多重继承(混合继承)和其他⾯向对象的策略。他们⾮常灵活,可以节省很多的⼯作量。但是⼀开始可能相对⽐较难上⼿。

起初,很难说出发⽣了什么,因为代码执⾏流程看起来并不明显,因为在⽗类中隐藏了⼤量代码。官⽅⽂档也有⼀定的难度,主要是因为属性和⽅法有时分布在⼋个⽗类中。

使⽤ GCBV 时,最好打开 ccbv.co.uk (需科学上⽹) 以便快速参考。

web

现在我们来看⼀个 GCBV 的例⼦。

¶ views.py

1
2
3
4
5
6
7
from django.views.generic import CreateView

class NewPostView(CreateView):
model = Post
form_class = PostForm
success_url = reverse_lazy('post_list')
template_name = 'new_post.html'

这⾥我们使⽤了⼀个⽤于创建模型对象的通⽤视图。它会处理所有表单处理并在表单有效时保存对象。

因为它是⼀个 CBV,所以我们在 urls.py 中以与其他 CBV 相同的⽅式来引⽤它:

¶ urls.py

1
2
3
urlpatterns = [
url(r'^new_post/$', views.NewPostView.as_view(), name='new_post'),
]

GCBV 中的其他例⼦还有:detailview,deleteview,formview,updateview,listview。

(未完待续)

分享到 

 上一篇: 基于Django的Discuz论坛系统 下一篇: 2020年度个人工作总结 

© 2023 Mike lucis

Theme Typography by Makito

Proudly published with Hexo

备案号: 湘ICP备2021005917号-1

友情链接: Lonely's Bolg

ღゝ◡╹)ノ♡