Django:类视图,通用视图等

时间:2011-06-09 00:30:43

标签: python django

在与1.2版本的短暂会面之后,我将回到Django,现在在版本1.3中,受欢迎的视图方法似乎是在使用类。

牢记代码风格,可维护性和模块性:何时应该使用类,何时使用函数?我应该总是从泛型类视图扩展(使用TemplateView似乎没有任何害处),还是应该使用我自己的视图可调用对象?

提前致谢。

2 个答案:

答案 0 :(得分: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,
    })

在基于类的等价物中,样板代码和令人讨厌的嵌套ifs消失了:

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应用程序中混合样式往往看起来非常混乱。所以,一旦我有一些真正受益于基于类的观点,这是一个很容易的步骤来切换所有批次。

答案 1 :(得分:3)

在我看来,有两种情况需要基于类(-generic)-views:

  • 您的视图中确实需要通用功能,而且需要额外的功能。
  • 您编写了一个可重复使用的Django应用程序,并希望其他人可以扩展您的观点。

对于其他任何事情,请使用您感觉最舒服的东西。正如你所说,你基本上可以继续从TemplateView扩展并覆盖各自的方法,尽管你也可以使用基于函数的方法(并且必须自己处理渲染模板调用)。这最终取决于你。

编辑:基于类的视图的另一个优点是,它允许您以更清晰的方式根据request.method分隔代码,甚至返回405 Method Not Allowed响应代码当使用错误的方法时。因此,您根本不必处理if request.method=='POST'if request.method=='GET'等行,只需扩展postget方法。