您的位置:首页 > 编程语言 > Go语言

Django通用视图进阶笔记

2017-07-01 00:00 387 查看

常用的通用视图:

View

ListView

TemplateView

DetailView

一.Base Views

1. django.views.generic.base.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.conf.urls import patterns, url

from myapp.views import MyView

urlpatterns = patterns('',
url(r'^mine/$', MyView.as_view(), name='my-view'),
)


2. django.views.generic.base.TemplateView

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

# urls.py

from django.conf.urls import patterns, url

from myapp.views import HomePageView

urlpatterns = patterns('',
url(r'^$', HomePageView.as_view(), name='home'),
)


3. django.views.generic.base.RedirectView

用来进行跳转, 默认是永久重定向(301),可以直接在urls.py中使用,非常方便:

from django.conf.urls import patterns, url
from django.views.generic.base import RedirectView

urlpatterns = patterns('',
url(r'^go-to-django/$', RedirectView.as_view(url='http://djangoproject.com'), name='go-to-django'),
url(r'^go-to-ziqiangxuetang/$', RedirectView.as_view(url='http://www.ziqiangxuetang.com',permant=False), name='go-to-zqxt'),
)


二.Generic Display View (通用显示视图)

1. django.views.generic.detail.DetailView

DetailView 有以下方法:

dispatch()

http_method_not_allowed()

get_template_names()

get_slug_field()

get_queryset()

get_object()

get_context_object_name()

get_context_data()

get()

render_to_response()

# views.py
from django.views.generic.detail import DetailView
from django.utils import timezone

from articles.models import Article

class ArticleDetailView(DetailView):

model = Article # 要显示详情内容的类

template_name = 'article_detail.html'
# 模板名称,默认为 应用名/类名_detail.html(即 app/modelname_detail.html)

# 在 get_context_data() 函数中可以用于传递一些额外的内容到网页
def get_context_data(self, **kwargs):
context = super(ArticleDetailView, self).get_context_data(**kwargs)
context['now'] = timezone.now()
return context

# urls.py
from django.conf.urls import url

from article.views import ArticleDetailView

urlpatterns = [
url(r'^(?P<slug>[-_\w]+)/$', ArticleDetailView.as_view(), name='article-detail'),
]

article_detail.html

<h1>标题:{{ object.title }}</h1>
<p>内容:{{ object.content }}</p>
<p>发表人: {{ object.reporter }}</p>
<p>发表于: {{ object.pub_date|date }}</p>

<p>日期: {{ now|date }}</p>


2. django.views.generic.list.ListView

[b]ListView 有以下方法:[/b]

dispatch()

http_method_not_allowed()

get_template_names()

get_queryset()

get_context_object_name()

get_context_data()

get()

render_to_response()

# views.py
from django.views.generic.list import ListView
from django.utils import timezone

from articles.models import Article

class ArticleListView(ListView):

model = Article

def get_context_data(self, **kwargs):
context = super(ArticleListView, self).get_context_data(**kwargs)
context['now'] = timezone.now()
return context

# urls.py:

from django.conf.urls import url

from article.views import ArticleListView

urlpatterns = [
url(r'^$', ArticleListView.as_view(), name='article-list'),
]

article_list.html

<h1>文章列表</h1>
<ul>
{% for article in object_list %}
<li>{{ article.pub_date|date }} - {{ article.headline }}</li>
{% empty %}
<li>抱歉,目前还没有文章。</li>
{% endfor %}
</ul>

官方文档:猛戳这里
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Django 通用视图