[Django1.5]two-scoops-django-best-practics 笔记四

来源:互联网 发布:js apply的z作用 编辑:程序博客网 时间:2024/06/05 04:08

chapter 7 

Function-and Class-Based Views 

Django1.5 有这两种模式
function-based views FBVs
class-based views CBVs 

什么时候使用FBVs或者CBVs?


Keep view Logic out of URLconfs 
*views模块应该包含view逻辑
*URL模块应该包含URL逻辑
而不是混为一谈


最好不要有这样的代码:
# Similar to the Polls examplefrom django.conf.urls import patterns, urlfrom django.views.generic import DetailViewfrom tastings.models import Tastingurlpatterns = patterns('',    url(r'^(?P<pk>\d+)/$',        DetailView.as_view(            model=Tasting,            template_name='tastings/detail.html'),        name='detail'),    url(r'^(?P<pk>\d+)/results/$',        DetailView.as_view(            model=Tasting,            template_name='tastings/results.html'),        name='results'),)


这样的代码也可以使用,但是违法了松耦合,DRY原则,并且会使项目的可维护性大大降低。


Loose Coupling 松耦合的URLConfs案例:
# tastings/views.pyfrom django.views.generic import DetailViewfrom .models import Tastingclass TasteDetailView(DetailView):    model = Tastingclass TasteResultsView(TasteDetailView):    template_name = 'tastetests/results.html'

# tastings/urls.pyfrom django.conf.urls import patterns, urlfrom .views import TastingDetailView, TastingResultsViewurlpatterns = patterns('',    url(        regex=r'^(?P<pk>\d+)/$',        view=TastingDetailView.as_view(),        name='detail'    ),    url(        regex=r'^(?P<pk>\d+)/results/$',        view=TastingResultsView.as_view(),        name='results'    ),)
好处:DRY,松耦合原则等
这个还没有在实际项目中用过CBVs原则,需要研究下,FBVs做练习比较快,但是设计上还有缺陷。

chapter 8 

CBVs最佳实践:


Class Based Views从django1.3开始支持,可以提高view代码的重用性,使得代码更加有力和灵活。


在django1.5的文档中有专门的DBVs的说明。


CBVs指导原则:
*越少的view代码越好
*不要重复view中的代码
*Views应该处理表现层代码,业务逻辑应该交给Models或者Forms
*保持你的views简洁
*保持你的混合类使用更加简单


多态接口(Mixins): 不好翻译,没见过,直翻。。
混合类:



在多继承编程语言中,mixins是一种聚集功能的方法。
多继承中使用原则:
*Django自身提供的类应该在右边(多继承中父类排列方式)
*mixins应该在左边
*mixins应该继承python内置object类
ex:
from django.views.generic import TemplateViewclass FreshFruitMixin(object):    def get_context_data(self, **kwargs):        context = super(FreshFruitMixin,                    self).get_context_data(**kwargs)        context["has_fresh_fruit"] = True        return contextclass FruityFlavorView(FreshFruitMixin, TemplateView):    template_name = "fruity_flavor.html"

那么CBV应该在什么样的任务场景呢?

django.views.generic?是什么??


声明:图片和代码均引用自 《two-scoops-django-best-practics》

原创粉丝点击