83
4

5 回答 5

50

您可以对一个类进行子类化,并针对特定情况优化 get_context_data 等方法,并将其余部分保持原样。你不能用函数做到这一点。

例如,您可能需要创建一个新视图来完成前一个视图所做的一切,但您需要在上下文中包含额外的变量。子类化原始视图并覆盖 get_context_data 方法。

此外,将渲染模板所需的步骤分离到单独的方法中可以促进更清晰的代码 - 方法中完成的越少,就越容易理解。使用常规视图功能,所有这些都被转储到一个处理单元中。

于 2010-12-07T04:19:29.807 回答
18

如果self.args[0]困扰您,另一种选择是:

urlpatterns = patterns('books.views',
    url(r'^books/(?P<slug>\w+)/$', 'publisher_books_list', name="publisher_books_list"),
)

然后您可以改用self.kwargs['slug']它,使其更具可读性。

于 2011-01-21T15:45:24.550 回答
10

您的示例函数和类在功能上不相等。

基于类的版本免费提供分页,并禁止使用除 GET 之外的其他 HTTP 动词。

如果你想把它添加到你的函数中,它会更长。

但事实上,它更复杂。

于 2011-03-25T13:41:09.507 回答
4

这是我第一次听到这个——我喜欢它。

老实说,我在这里看到的优势是它使视图与 Django 整体更加一致。模型是类,我一直认为视图也应该如此。我不知道一切都是,但视图和模型是两种使用频率很高的类型

至于技术优势?好吧,在 Python 中,一切都是类(或对象?)——那么真的有区别吗?首先不是 99% 的语法糖吗?

于 2010-12-06T20:36:43.563 回答
1

考虑基于类的视图的一种方法是,它们就像一个没有训练轮的 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

达到同样的效果。同样,如果您考虑大量定制管理员,您会看到很多重叠。

此处的此站点也应使您更好地了解他们的工作。

http://ccbv.co.uk/

于 2015-03-19T14:16:24.403 回答