Django:类视图、通用视图等

5 投票
2 回答
754 浏览
提问于 2025-04-16 19:13

我之前接触过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' 这样的代码,只需扩展 postget 方法就行了。

撰写回答