在与1.2版本的短暂会面之后,我将回到Django,现在在版本1.3中,受欢迎的视图方法似乎是在使用类。
牢记代码风格,可维护性和模块性:何时应该使用类,何时使用函数?我应该总是从泛型类视图扩展(使用TemplateView似乎没有任何害处),还是应该使用我自己的视图可调用对象?
提前致谢。
答案 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:
对于其他任何事情,请使用您感觉最舒服的东西。正如你所说,你基本上可以继续从TemplateView
扩展并覆盖各自的方法,尽管你也可以使用基于函数的方法(并且必须自己处理渲染模板调用)。这最终取决于你。
编辑:基于类的视图的另一个优点是,它允许您以更清晰的方式根据request.method
分隔代码,甚至返回405 Method Not Allowed
响应代码当使用错误的方法时。因此,您根本不必处理if request.method=='POST'
或if request.method=='GET'
等行,只需扩展post
或get
方法。