【发布时间】:2011-06-09 00:30:43
【问题描述】:
在与 1.2 版短暂接触后,我将回到 Django,而现在在 1.3 版中,最受欢迎的视图方法似乎是使用类。
牢记代码风格、可维护性和模块化:我应该什么时候使用类,什么时候使用函数?我应该始终从通用类视图扩展(使用 TemplateView 似乎没有害处),还是应该使用自己的视图可调用对象?
提前致谢。
【问题讨论】:
在与 1.2 版短暂接触后,我将回到 Django,而现在在 1.3 版中,最受欢迎的视图方法似乎是使用类。
牢记代码风格、可维护性和模块化:我应该什么时候使用类,什么时候使用函数?我应该始终从通用类视图扩展(使用 TemplateView 似乎没有害处),还是应该使用自己的视图可调用对象?
提前致谢。
【问题讨论】:
我发现基于类的视图有助于使我的代码保持可读性和精简性。
以表单文档中的示例(基于函数)视图为例:
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,
})
在基于类的等效项中,样板代码和讨厌的嵌套 if 消失了:
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 应用程序中混合样式往往看起来很混乱。因此,一旦我有了一些真正受益于基于类的视图,就可以轻松地切换所有视图。
【讨论】:
在我看来,有两种情况需要基于类的(-generic)-views:
对于其他任何事情,请使用您觉得最舒服的方式。正如您所说,您基本上可以从TemplateView 扩展并覆盖相应的方法,尽管您也可以使用基于函数的方法(并且必须自己处理渲染模板调用)。这最终取决于你。
编辑:基于类的视图的另一个优点是它可以让您以更清晰的方式根据request.method 分隔代码,甚至在错误方法时返回405 Method Not Allowed 响应代码用来。因此,您根本不必处理 if request.method=='POST' 或 if request.method=='GET' 之类的行,只需扩展 post 或 get 方法即可。
【讨论】: