Django 框架中通用类视图的用法

2016-06-29 20:23杨刚
电脑知识与技术 2016年13期
关键词:列表视图用法

杨刚

摘要:Django是一个开源的Web开发框架,它为Web开发中的常见问题提供了完整的解决方案。Django定义了一些基于类的通用视图,用于解决一些常见的Web任务。该文主要介绍了类视图的基本用法以及几个常用的类视图。

关键词:Django;类;Web

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)13-0103-02

1类视图的基本使用

Django中的视图是一个可调用对象,在Django的早期版本中,视图用函数来实现。随着Django的不断发展,Django的技术团队提供了新的实现,用类来表示视图,并且针对Web开发中的常见任务,定义了大量的通用类视图。使用基于类的视图,可以更好的构建视图的内在逻辑,并且利于继承和混合重用。使用基于类的视图主要用2种方式:

1)在URLconf 中的简单用法

如果只是修改类的一些简单的属性,在URLconf 中直接使用基于类的视图,是最简单职业的方法。可以将要修改的属性直接传递给类视图的as_view() 方法:

from django.conf.urls import url

from django.views.generic import TemplateView

urlpatterns=[url(

r'^home/',TemplateView.as_view(template_name="about.html))]

在这个例子中,我们设置TemplateView的template_name属性。可以使用类似的方法覆盖RedirectView 的query_string属性。

2)子类化通用视图

使用类视图的第二种方法是继承一个已经存在的类视图,然后在子类中覆盖其属性或方法、例如,考虑只显示一个模板home.html 的视图。Django 有一个通用视图TemplateView来做这件事,所以我们可以简单地子类化它,并覆盖模板的名称:

fromdjango.views.genericimportTemplateView

classHomeView(TemplateView):

template_name="home.html"

然后我们只需要添加这个新的视图到我们的URLconf 中。TemplateView是一个类不是一个函数,所以我们将URL 指向类的as_view()方法,它让基于类的视图提供一个类似函数的入口:

fromdjango.conf.urlsimporturl

fromsome_app.viewsimportAboutView

urlpatterns=[url(r'^about/',AboutView.as_view())]

2几种常用的类视图

针对Web开发中的常见任务,Django定义了一组基础视图、一组通用显示视图以及一组通用编辑视图等类视图。下面依次介绍几个常用的类视图。

1)TemplateView

TemplateView是基础视图。该视图主要用于渲染一个给定的模板。它的template_name属性用于指定模板,get_context_data方法用于获得显示在模板中的数据。

classHomePageView(TemplateView):

template_name="home.html"

defget_context_data(self,**kwargs):

context=super(HomePageView,self).get_context_data(**kwargs)

context['latest_articles']=Article.objects.all()[:5]

returncontext

2)ListView

ListView是一个通用显示视图,主要用于显示一个对象列表。可以通过重写它的get_queryset方法,来获取要显示的列表。

class ObjectList(ListView):

def get_queryset(self):

modelobj = get_model(self.kwargs['app'], self.kwargs['model'])

# 获得url后的参数

kwargs = self.request.GET.dict()

return modelobj.objects.filter(**kwargs)

在get_queryset方法中,使用get_model方法可以动态的根据app和model来获取模型,列表的查询参数可以写在url的后面。

3)DeleteView

DeleteView是一个通用编辑视图,主要用于删除一个指定的对象。可以通过重写它的get_object方法,来指定要删除的对象。

class ObjectDelete(DeleteView):

def get_object(self):

modelobj = get_model(self.kwargs['app'], self.kwargs['model'])

obj = modelobj.objects.get(pk=self.kwargs['pk'])

return obj

4)CreateView

CreateView也是一个通用编辑视图,主要用于创建一个对象。可以通过重写它的get_initial进行初始化,可以通过重写get_template_names方法来指定模板。

class ObjectCreate(CreateView):

def get_initial(self):

return self.request.GET.dict()

def get_template_names(self):

'''如果模型中制定了模板,则使用该模板,否则使用默认的模板'''

modelobj = get_model(self.kwargs['app'], self.kwargs['model'])

if hasattr(modelobj.Display, 'create_template'):

return modelobj.Display.create_template

else:

return ['xadmin/object.html']

通过使用Django中的通用类视图,可以大幅提高工作效率。

参考文献:

[1] 杨志庆.基于Django的Blog系统的开发与实现[J].机电一体化,2013(9).

猜你喜欢
列表视图用法
address的高级用法你知道吗?
学习运用列表法
“作”与“做”的用法
视图
特殊用法
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图
不含3-圈的1-平面图的列表边染色与列表全染色
“撞车”、“撞衫”及其流行中的三种用法