今天冷知识百科网小编 甘如宇 给各位分享mixin是什么牌子表的知识,其中也会对如何正确使用 CBVs(如何正确使用手机)相关问题进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在我们开始吧!
如何正确使用 CBVs
Class-based views是Django为解决建站过程中的常见的呈现模式而建立的. 在这节中, 我们着重讲一下CBVs的使用技巧和一般原则.
1. CBVs的使用原则
代码越少越好
永远不要重复代码
View应当只包含呈现逻辑, 不应包括业务逻辑
保持view逻辑清晰简单
不要将CBVs用作403, 404, 500的错误处理程序
保持mixin简单明了
2. 如何使用mixin
在编程中mixin是指为继承它的class提供额外的功能, 但它自身却不能单独使用的类. 在具有多继承能力的编程语言中, mixin可以为类增加额外功能或方法. 在Django中, 我们可以使用mixin为CBVs提供更多的扩展性, 当然在类继承过程中, 我们推荐以下原则:
Django自身提供的View永远在最右边
mixin依次在以上view的左边
mixin永远继承自Python的object类型
在这里顺便推荐一个很好的django库: django-braces. 该库中提供众多django的mixin, 可以方便我们日常使用.
以下是一个简单地例子, TemplateView是django自身提供的基本View, 因此在最右边; FreshFruitMixin则在TemplateView左边; FreshFruitmixin继承自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
return context
class FruitFlavorView(FreshFruitMixin, TemplateView):
template_name = "fruit_flavor.html"
3. 如何使用Django自身的CBV
CBVs在功能上的可扩展性, 牺牲的是简单性, 一个CBV最多的时候拥有8个import关系. (如果希望进一步了解这些继承关系, 可以使用Classy Class-Based Views进行查看.) 所以要弄懂那个View最适合当下的场景对于开发人员也是一个挑战. 为了减少CBVs的使用难度, 我们将这些View和基本的用法列在下表中, 为了显示方便, 名字前的django.views.generic前缀皆省去:
名字
目的
例子
View
基本View, 可以在任何时候使用
见后面详细介绍
RedirectView
重新定向到其他URL
将访问"/log-in/"的用户重新定向到"/login/"
TemplateView
显示Django HTML template
一般网站中使用模板显示的页
ListView
显示对象列表
文章列表页
DetailView
显示对象详情
文章详细页
FormView
提交From
网站联系我们或emai订阅form
CreateView
创建对象
创建新文章页
UpdateView
更新对象
修改文章页
DeleteView
删除对象
删除文章页
Generic date views
显示一段时间内的对象
按时间归类的博客
4. CBVs的使用技巧
a. 限定访问权限
在django tutorial中介绍了如何一起使用django***ntrib.auth.decorators.login_required和CBV, 这是一个典型的错误例子.
还好, 我们有django-braces. 在django-braces中已经提供了一个LoginRequiredMixin:
# myapp/views.py
from django.views.generic import DetailView
from braces.views import LoginRequiredMixin
from .models import Article
class ArticleDetailView(LoginRequiredMixin, DetailView):
model = Article
b. 在form提交成功后执行代码
当需要在form提交成功后执行自定义的代码时, 可以使用form_valid()方法, form_valid()方法返回的是django.http.HttpResponseRedirect:
# myapp/views.py
from django.views.generic import CreateView
from braces.views import LoginRequiredMixin
from .models import Article
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
fields = ('title', 'slug', 'content')
def form_valid(self, form):
# 自定义的代码逻辑写在这里
return super(ArticleCreateView, self).form_valid(form)
c. 在form提交不成功后执行代码
当需要在form提交不成功后执行自定义的代码时, 可以使用form_invalid()方法, form_invalid()方法返回的也是django.http.HttpResponseRedirect:
# myapp/views.py
from django.views.generic import CreateView
from braces.views import LoginRequiredMixin
from .models import Article
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
def form_invalid(self, form):
# 自定义的代码逻辑写在这里
return super(ArticleCreateView, self).form_invalid(form)
5. CBV和form如何结合使用
下面我们介绍一下常见的django form和CBV结合使用的模式, 首先我们定义一个Article model方便举例:
# myapp/models.py
from django.db import models
from django***re.urlresolvers import reverse
STATUS = {
(0, 'zero'),
(1, 'one'),
}
class Article(models.Model):
title = model.CharField(max_length=255)
slug = model.SlugField()
review_num = models.IntegerField(default=0, choices=STATUS)
def get_absolute_url(self):
return reverse("article_detail", kwargs={"slug": self.slug})
a. Views和ModelForm
下面的例子中, 我们利用django***ntrib.messages和CBVs构建一套创建, 更新和显示一篇article的view, 包括:
ArticleCreateView: 用于创建新article
ArticleUpdateView: 用于更新article
ArticleDetailView: 用于确认创建或更新后的article
# myapp/views.py
from django***ntrib import messages
from django.views.generic import CreateView, UpdateView, DetailView
from braces.views import LoginRequiredMixin
from .models import Article
class ArticleActionMixin(object):
@property
def success_msg(self):
return NotImplemented
def form_valid(self, form):
messages*****(self.request, self.success_msg)
return super(ArticleActionMixin, self).form_valid(form)
class ArticleCreateView(LoginRequiredMixin, ArticleActionMixin, CreateView):
model = Article
fields = ('title', 'slug', 'review_num')
success_msg = "Article Created!"
class ArticleUpdateView(LoginRequiredMixin, ArticleActionMixin, UpdateView):
model = Article
fields = ('title', 'slug', 'review_num')
success_msg = "Article Updated!"
class ArticleDetailView(DetailView):
model = Article
接下来是template
{# templates/myapp/article_detail.html #}
{% if messages %}
{% for message in messages %}
{ message }
{% endif %}
b. Views和Form
下面我们以搜索article功能为例子, 介绍一下CBV和form的常见使用样式, 在article列表页中点击搜索按钮, 显示搜友符合条件的article列表:
# myapp/views.py
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
def get_queryset(self):
queryset = super(ArticleListView, self).get_queryset()
q = self.request.GET.get('q')
if q:
return queryset.filter(title__icontains=q)
return queryset
然后可以使用include以下tenplate呈现搜索form:
{# templates/myapp/_article_search.html #}
搜索
6. 单独使用View
只用django.views.generic.View, 而不用FBV来构建所有django项目中的view也是可行的, 这也没有你所想象的那么复杂. 使用View的好处是, 我们不需要写许多内套式的if语句, 我们可以直接覆盖使用View的get(), post()等方法:
from django.shortcuts import get_object_or_404, render, redirect
from django.views.generic import View
from braces.views import LoginRequiredMixin
from .forms import ArticleForm
from .models import Article
class ArticleView(LoginRequiredMixin, View):
def get(self, request, *args, **kwargs):
article = get_object_or_404(Article, pl=kwargs['slug'])
return render(request,
"myapp/article_detail.html",
{"article": article}
)
def post(sele, request, *args, **kwargs):
article = get_object_or_404(Article, pl=kwargs['slug'])
form = ArticleForm(request.POST)
if form.is_valid():
form.save()
return redirect("myapp:article", article.slug)
sass/scss 和 less的区别
Sass (Syntactically Awesome Stylesheets)是一种动态样式语言,语法跟css一样(但多了些功能),比css好写,而且更容易阅读。Sass语法类似与Haml,属于缩排语法(makeup),用意就是为了快速写Html和Css。
Less一种动态样式语言. 将CSS赋予了动态语言的特性,如变量,继承,运算, 函数. LESS 既可以在客户端上运行 (支持IE 6+, Webkit, Firefox),也可一在服务端运行 (借助 Node.js)。
和bootstrap类似的前端框架有哪些?
Bootstrap比较全面了,其它做的没有他全,但也各有特色。
99lime
Skeleton
Fbootstrapp 基于Bootstrap 类似facebook的UI
万能表的原理及使用方法
SAP物料分类账物料计价方式 V+2 V+3 S+3是什么意思呢?
为什么感觉django里面class based view很难
没有什么难的啊,只要继承了django的View基类就可以了
# views.py
from django.http import HttpResponse
from django.views.generic import View
class MyView(View):
def get(self, request, *args, **kwargs):
return HttpResponse('Hello, World!')
# urls.py
from django***nf.urls import patterns, url
from myapp.views import MyView
urlpatterns = patterns('',
url(r'^mine/$', MyView.as_view(), name='my-view'),
)