Django 学习笔记(十五②)

来源:互联网 发布:手机通讯软件作用 编辑:程序博客网 时间:2024/05/16 06:06

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的前缀。

NamepurposeTwo Scoops ExampleView 基础视图可以被重用到任何地方See the section called Implementing a
Simple JSON API.RedirectView重定向到其他UrlSend users who visit ‘/log-in/’ to ‘/login/’.TemplaetView展示Django HTML模版The ‘/about/’ page of our site.ListView列出objectsList ice cream flavors.DetailView列出一个objectDetails on an ice cream flavorFormView提交一表单The site's contact or email form.CreateView创建一对象实例Create a new ice cream flavorUpdateView更新一对象实例Update an existing ice cream flavor.DelteView删除一对象实例Delete an unpleasant ice cream flavor
like Vanilla Steak.Generic date ViewsFor display of object that occur over a range of timeBlogs 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了,汗!


原创粉丝点击