【问题标题】:Django: class views, generic views, etcDjango:类视图、通用视图等
【发布时间】:2011-06-09 00:30:43
【问题描述】:

在与 1.2 版短暂接触后,我将回到 Django,而现在在 1.3 版中,最受欢迎的视图方法似乎是使用类。

牢记代码风格、可维护性和模块化:我应该什么时候使用类,什么时候使用函数?我应该始终从通用类视图扩展(使用 TemplateView 似乎没有害处),还是应该使用自己的视图可调用对象?

提前致谢。

【问题讨论】:

    标签: python django


    【解决方案1】:

    我发现基于类的视图有助于使我的代码保持可读性和精简性。

    以表单文档中的示例(基于函数)视图为例:

    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 应用程序中混合样式往往看起来很混乱。因此,一旦我有了一些真正受益于基于类的视图,就可以轻松地切换所有视图。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 感谢您抽出宝贵时间回答,似乎没有人喜欢这个问题:P。如果没有充分的理由选择某一种方式,我会根据具体情况做出决定,同时尽量保持一致性。
      猜你喜欢
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多