Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

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

$
0
0

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 example
	from django.conf.urls import patterns, url
	from django.views.generic import DetailView
	from tastings.models import Tasting
	urlpatterns = 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.py
	from django.views.generic import DetailView
	from .models import Tasting
	class TasteDetailView(DetailView):
	    model = Tasting
	class TasteResultsView(TasteDetailView):
	    template_name = 'tastetests/results.html'

	# tastings/urls.py
	from django.conf.urls import patterns, url
	from .views import TastingDetailView, TastingResultsView
	urlpatterns = 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 TemplateView
	class FreshFruitMixin(object):
	    def get_context_data(self, **kwargs):
	        context = super(FreshFruitMixin,
	                    self).get_context_data(**kwargs)
	        context["has_fresh_fruit"] = True
	        return context
	class FruityFlavorView(FreshFruitMixin, TemplateView):
    template_name = "fruity_flavor.html"

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

django.views.generic?是什么??


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

作者:lzz957748332 发表于2013-5-10 23:34:12 原文链接
阅读:44 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles