在Django 1.7中在一个基于类的视图中使用多个通用视图和表单的最佳实践

时间:2014-11-05 21:56:02

标签: python django multiple-inheritance django-class-based-views django-generic-views

我试图弄清楚如何在Django 1.7中使用多个基于类的通用视图和表单。我熟悉基于函数的视图,但最近才尝试基于类的视图。

我理解基于类的视图的方式是它是一个包含方法的python类,其中包括post,get,delete和其他HTTP请求方法。当收到其中一个请求方法时,将调用这些方法。例如,如果收到HTTP GET,则将执行基于类的视图中的get()方法。

现在在Django docs here上,他们将这段代码作为其views.py文件的示例

from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.core.urlresolvers import reverse_lazy
from myapp.models import Author

class AuthorCreate(CreateView):
    model = Author
    fields = ['name']

class AuthorUpdate(UpdateView):
    model = Author
    fields = ['name']

class AuthorDelete(DeleteView):
    model = Author
    success_url = reverse_lazy('author-list')

我对此感到有点困惑,因为我觉得做这样的事情会更好:

from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.core.urlresolvers import reverse_lazy
from myapp.models import Author

class Author(CreateView, DeleteView):
    model = Author
    fields = ['name']
    success_url = reverse_lazy('author-list')
#I assume this would have to be separate because they both implement a post method
class AuthorUpdate(UpdateView):
        model = Author
        fields = ['name']

因为代码行较少,您可以使用单个基于类的视图来执行所有这三个操作。我在网上找到的所有东西似乎都模仿了文档并创建了多个基于类的视图,而不是在一个基于类的视图中使用多个泛型。

我的问题是,代码是用这种方式编写的吗?在单个基于类的视图中使用多个泛型的最佳实践究竟是什么?或者我甚至能以这种方式使用多个?基本上我可以像上面那样写这三个观点吗?

1 个答案:

答案 0 :(得分:0)

我对你的问题感到有些困惑。这些是三个单独的视图,可以在不同的URL上访问,并且可能使用不同的模板。将它们放入一个单独的课程中没有任何好处。相反,它会使事情变得更复杂:你如何确定POST是更新还是删除?

你最后提到了REST。如果您正在寻找的是某种REST API,那么您确实需要Django REST Framework,它提供了基于REST的通用视图。