杨刚
摘要: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).