Django:类视图、通用视图等
我之前接触过Django 1.2,现在又回到Django,发现1.3版本中,大家更喜欢用类来写视图。
考虑到代码风格、可维护性和模块化:我应该什么时候用类,什么时候用函数呢?我是不是应该总是从通用类视图继承(用TemplateView似乎没什么坏处),还是应该用我自己的视图可调用对象呢?
提前谢谢你们。
2 个回答
7
我发现使用基于类的视图可以让我的代码更清晰、更简洁。
比如说,看看表单文档中的这个示例(基于函数的)视图:
def contact(request):
if request.method == 'POST': # If the form has been submitted...
form = ContactForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
# Process the data in form.cleaned_data
# ...
return HttpResponseRedirect('/thanks/') # Redirect after POST
else:
form = ContactForm() # An unbound form
return render_to_response('contact.html', {
'form': form,
})
而在基于类的版本中,冗长的代码和那些复杂的嵌套条件判断都消失了:
class Contact(FormView):
template_name = 'contact.html'
form_class = ContactForm
success_url = '/thanks/'
def form_valid(self, form):
# Process the data in form.cleaned_data
return super(Contact, self).form_valid(form)
另外,虽然你可以在同一个Django应用中随意混合使用基于函数和基于类的视图,但我觉得这样混合使用会显得很乱。所以,一旦我有几个视图确实受益于使用基于类的方式,转而将所有视图都改成基于类的就变得很简单了。
4
在我看来,使用基于类的视图(类视图)有两个必要的情况:
- 你真的需要在视图中使用一些通用功能,并且还想要额外的功能。
- 你在写一个可重用的Django应用,想让别人能够扩展你的视图。
对于其他情况,使用你觉得最舒服的方式就可以。正如你所说的,继承自 TemplateView
并重写相应的方法基本上是个不错的选择,当然你也可以选择基于函数的方式(那样你就得自己处理模板渲染的调用)。最终选择权在你。
补充说明:基于类的视图还有一个好处,就是它可以让你根据 request.method
更清晰地分离代码,并且在使用错误的方法时会返回 405 Method Not Allowed
的响应代码。所以你根本不需要处理像 if request.method=='POST'
或 if request.method=='GET'
这样的代码,只需扩展 post
或 get
方法就行了。