5 回答
您可以对一个类进行子类化,并针对特定情况优化 get_context_data 等方法,并将其余部分保持原样。你不能用函数做到这一点。
例如,您可能需要创建一个新视图来完成前一个视图所做的一切,但您需要在上下文中包含额外的变量。子类化原始视图并覆盖 get_context_data 方法。
此外,将渲染模板所需的步骤分离到单独的方法中可以促进更清晰的代码 - 方法中完成的越少,就越容易理解。使用常规视图功能,所有这些都被转储到一个处理单元中。
如果self.args[0]
困扰您,另一种选择是:
urlpatterns = patterns('books.views',
url(r'^books/(?P<slug>\w+)/$', 'publisher_books_list', name="publisher_books_list"),
)
然后您可以改用self.kwargs['slug']
它,使其更具可读性。
您的示例函数和类在功能上不相等。
基于类的版本免费提供分页,并禁止使用除 GET 之外的其他 HTTP 动词。
如果你想把它添加到你的函数中,它会更长。
但事实上,它更复杂。
这是我第一次听到这个——我喜欢它。
老实说,我在这里看到的优势是它使视图与 Django 整体更加一致。模型是类,我一直认为视图也应该如此。我不知道一切都是,但视图和模型是两种使用频率很高的类型。
至于技术优势?好吧,在 Python 中,一切都是类(或对象?)——那么真的有区别吗?首先不是 99% 的语法糖吗?
考虑基于类的视图的一种方法是,它们就像一个没有训练轮的 Django 管理员,因此更加灵活(但更难理解)。
例如,admin 中的列表显示显然是基于通用 ListView。最简单的列表视图,您只需定义一个模型或查询集。
class MyExampleView(ListView);
model = ExampleModel
您需要提供自己的模板,但它基本上与最基本的 ModelAdmin 相同。模型管理中的 list_display 属性将告诉它要显示哪些字段,而在 ListView 中,您将在模板中执行此操作。
class SpeciesAdmin(admin.ModelAdmin):
list_display = ['name']
admin.site.register(ExampleModel , ExampleModelAdmin)
使用管理员,您有一个参数
list_per_page = 100
它定义了每页有多少对象。列表视图有
paginate_by = 100
达到同样的效果。同样,如果您考虑大量定制管理员,您会看到很多重叠。
此处的此站点也应使您更好地了解他们的工作。