Two scoops of Django 1.5第八章混合类,原先说实在的真是没接触过mixin(混合类),现在就翻译这一部分吧
mixins(混合类)
在程序设计中,混合类提供的功能是可继承的,但它本身不能被实例化。在编程语言使用多重继承,
混合类是实现聚类一种手段。
当使用混合类合成自己的视图类,我们推荐Kenneth Love提出的继承规则。这些规则遵循Python的方法规则,
尽可能用最简单的定义方式,方法解析是从左到右(也就是说继承类是混合类在左边,普通类在右边):
注:所说的方位都是继续的类的设置方位
Django基础视图类总是放在右边
混合类在基础视图的左边
混合类继承于Python内建object类型
下面给出实例:
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
r return context
class FruityFlavorView(FreshFruitMixin, TemplateView):
template_name = "fruity_flavor.html"
在上面相当silly的列子中,这FruityFlavorView 类是从FreshFruitMixin 和 TemplateView继承而来的。因为TemplateView
是基础视图类所提供,它被放在最右,我们把FreshFruitMixin放在最左。我们知道这一方式我们的方法与性能都将执行顺畅。
Which Django CBV Should Be Used For What Task?
对与确定在哪里使用哪一视图对于开发者来说是很有挑战性的。有一些观点是显而易的,比如那些执行操作,创建、读取、更新或删除数据
的操作,但是其他的操作就比较难以确定。
此处有一便捷图表其列出其名称,以及每一Django CVBs的目的。所以列出的视图都被假设为Django.views.generic的前缀。
Name | purpose | Two Scoops Example |
View | 基础视图可以被重用到任何地方 | See the section called Implementing a Simple JSON API. |
RedirectView | 重定向到其他Url | Send users who visit ‘/log-in/’ to ‘/login/’. |
TemplaetView | 展示Django HTML模版 | The ‘/about/’ page of our site. |
ListView | 列出objects | List ice cream flavors. |
DetailView | 列出一个object | Details on an ice cream flavor |
FormView | 提交一表单 | The site's contact or email form. |
CreateView | 创建一对象实例 | Create a new ice cream flavor |
UpdateView | 更新一对象实例 | Update an existing ice cream flavor. |
DelteView | 删除一对象实例 | Delete an unpleasant ice cream flavor like Vanilla Steak. |
Generic date Views | For display of object that occur over a range of time | Blogs are a common reason to use them. For Two Scoops, we could create a nice, public history of when flavors were added to the database. |
Generals Tips For Django CBVs
这一部分涵盖对于大多数Django CBVs开发 有用的建议
Constranging Django CBV Access to Aunthentication Users
虽然Django CBV文档提供了一个django.contrib.auth.decorators.login_required CBVs应用的例子,这使用起来很不方便。幸运的是,django-braces提供了一个现成的实现方式,您可以随时使用。例如:
# flavors/views.py
from django.views.generic import DetailView
from braces import LoginRequiredMixin
from .models import Flavor
class FlavorDetailView(LoginRequiredMixin, DetailView):
model = Flavor
TIP:不要忘记CBV 混合类的要求!
记住:
LoginRequiredMixin 必须在左边
基础视图类必须在右边
如果忘记或者改变规则,那么将引起不可预估的结果
依据表单在视图中定制逻辑操作
当您需要在一个视图中执行一个自定义操作时CBV工作流发送form_valid()方法请求。返回django.http.HttpResponseRedirect。
from django.views.generic import CreateView
from braces.views import LoginRequiredMixin
from .models import Flavor
class FlavorCreateView(LoginRequiredMixin, CreateView):
model = Flavor
def form_valid(self, form):
# Do custom logic here
return super(FlavorCreateForm, self).form_valid(form)
为无效表单在视图中定义操作
当你需要为无效表单在视图中执行自定义操作,form_invalid()方法是从Django CBV工作流发出request。这一方法返回django.http.HttpResponse
from django.views.generic import CreateView
from braces.views import LoginRequiredMixin
from .models import Flavor
class FlavorCreateView(LoginRequiredMixin, CreateView):
model = Flavor
def form_invalid(self, form):
# Do custom logic here
return super(FlavorCreateForm, self).form_invalid(form)
这一章总算翻译出来了,我了个艹,居然3:16了,汗!