Base views
下面三个class为创建Django视图提供了很多的功能。你可以把那些可以自己起作用或者从别处继承的视图当做父视图(parent views)。他们可能无法提供你的项目所需的所有功能,为了解决这种情况django给你提供了Mixins(混合类型)和Generic class-based views(基于类的泛型视图)。
View
class django.views.generic.base.View
基于主类的基视图。所有其他的基于类的视图都继承这个基类。严格意义上他不是一般视图,他也可以从django.views引入
方法
- dispatch()
- http_method_not_allowed
- options()
例子 views.py
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request, *args, **kwargs):
return HttpResponse('Hello, World!')
from django.views import View
class MyView(View):
def get(self, request, *args, **kwargs):
return HttpResponse('Hello, World!')
例子 urls.py
from django.conf.urls import url
from myapp.views import MyView
urlpatterns = [
url(r'^mine/$', MyView.as_view(), name='my-view'),
]
from myapp.views import MyView
urlpatterns = [
url(r'^mine/$', MyView.as_view(), name='my-view'),
]
属性
http_method_names
默认接受以下这些http方法
['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
Methods
类方法 as_view
返回一个视图,其中包含request和response
response = MyView.as_view()(request)
返回的视图含有 view_class和view_initkwargs两个属性
当视图在 request/response中被调用,HTTPRequest就被赋值给request属性。任何从url中获取的参数都会分别的赋值给 args和kwargs。然后dispatch()被调用
分发 dispatch(request,*args,**kwargs)
视图的一部分,这个方法接收request和其他的参数,返回一个HTTP response。
默认实现时会检查这个HTTP方法,并委托给匹配的HTTP方法;例如 GET会被委托给get(),POST会委托给post()。
默认把HEAD请求委托给get()。如果需要有额外的修改可以重写head()。例子在
https://docs.djangoproject.com/en/1.11/topics/class-based-views/#supporting-other-http-methods
http_method_not_allowed(request, *args, **kwargs)
如果视图调用了一个不被支持的HTTP方法,这个方法就会被调用,顶替上去。
默认的实现会返回HttpResponseNotAllowed包含一个支持的方法的list,在一个普通的text里。
options(request, *args, **kwargs)
对HTTP的处理。返回response包含视图所允许的HTTP方法名。
TemplateView
class django.views.generic.base.TemplateView
通过URL中的参数渲染一个模板
这个视图从以下视图继承而来
- django.views.generic.base.TemplateResponseMixin
- django.views.generic.base.ContextMixin
- django.views.generic.base.View
方法
- dispatch()
- http_method_not_allowed()
- get_context_data()
例子 views.py
from django.views.generic.base import TemplateView
from articles.models import Article
class HomePageView(TemplateView):
template_name = "home.html"
def get_context_data(self, **kwargs):
context = super(HomePageView, self).get_context_data(**kwargs)
context['latest_articles'] = Article.objects.all()[:5]
return context
from articles.models import Article
class HomePageView(TemplateView):
template_name = "home.html"
def get_context_data(self, **kwargs):
context = super(HomePageView, self).get_context_data(**kwargs)
context['latest_articles'] = Article.objects.all()[:5]
return context
例子 urls.py
from django.conf.urls import url
from myapp.views import HomePageView
urlpatterns = [
url(r'^$', HomePageView.as_view(), name='home'),
]
from myapp.views import HomePageView
urlpatterns = [
url(r'^$', HomePageView.as_view(), name='home'),
]
context
从url中获取的关键字参数 随便百度一下怎么url传值
RedirectView
class django.views.generic.base.RedirectView
重定位到置顶的url
所给的url可能包含一些带插值的字符串。因为关键词插值总是做完的,所以所有%都需要写成%%,python会重写成一个百分号%输出。
如果所给的url是NONE。Django会返回 一个410错误
这个视图从以下一个视图继承而来
- django.views.generic.base.View
方法
- dispatch()
- http_method_not_allowed()
- get_redirect_url()
例子 views.py
from django.shortcuts import get_object_or_404
from django.views.generic.base import RedirectView
from articles.models import Article
class ArticleCounterRedirectView(RedirectView):
permanent = False
query_string = True
pattern_name = 'article-detail'
def get_redirect_url(self, *args, **kwargs):
article = get_object_or_404(Article, pk=kwargs['pk'])
article.update_counter()
return super(ArticleCounterRedirectView, self).get_redirect_url(*args, **kwargs)
from django.views.generic.base import RedirectView
from articles.models import Article
class ArticleCounterRedirectView(RedirectView):
permanent = False
query_string = True
pattern_name = 'article-detail'
def get_redirect_url(self, *args, **kwargs):
article = get_object_or_404(Article, pk=kwargs['pk'])
article.update_counter()
return super(ArticleCounterRedirectView, self).get_redirect_url(*args, **kwargs)
例子 urls.py
from django.conf.urls import url
from django.views.generic.base import RedirectView
from article.views import ArticleCounterRedirectView, ArticleDetail
urlpatterns = [
url(r'^counter/(?P<pk>[0-9]+)/$', ArticleCounterRedirectView.as_view(), name='article-counter'),
url(r'^details/(?P<pk>[0-9]+)/$', ArticleDetail.as_view(), name='article-detail'),
url(r'^go-to-django/$', RedirectView.as_view(url='https://djangoproject.com'), name='go-to-django'),
]
from django.views.generic.base import RedirectView
from article.views import ArticleCounterRedirectView, ArticleDetail
urlpatterns = [
url(r'^counter/(?P<pk>[0-9]+)/$', ArticleCounterRedirectView.as_view(), name='article-counter'),
url(r'^details/(?P<pk>[0-9]+)/$', ArticleDetail.as_view(), name='article-detail'),
url(r'^go-to-django/$', RedirectView.as_view(url='https://djangoproject.com'), name='go-to-django'),
]
属性
url
重定向的url路径,或者为none时返回410错误
pattern_name
url的名字
permanent 永久性
关于重定向是否是永久的,如果True,返回的状态码是301,如果是False,返回的状态码是302.
默认是False。
query_string
查询字符串是否会被带到新的url地址后面。如果是True,查询字符串会被添加到url后面,如果是Fasle,查询字符串被丢弃。
默认是False。
方法
get_redirect_url(*arg, **kwargs)
为重定向解释url
默认的处理是把url作为一个字符串,把%后面的参数作为一组
如果没有设定url,这个方法会做一个尝试(我还不懂是什么尝试)
如果有query_string,他会被添加到处理过的url后。子类会实现他们想实现的东西,只要这个方法返回一个字符串url。