基于班级的观点(不能按照书中的叙述)

时间:2016-07-29 10:31:07

标签: django

Andrew Pinkham发布的Django示例

Django 1.8(不现代,但我按照这本书)。

class PostList(View):
    template_name = ''

    def get(self, request):
        return render(
            request,
            self.template_name,
            {'post_list': Post.objects.all()})   

urlpatterns = [
    url(r'^$',
        PostList.as_view(template_name='blog/post_list.html'),
        name='blog_post_list'),

在书中:

  
      
  1. 我们是否应该更改template_name类属性的值,例如,我们只需将其作为命名参数传递给   blog_post_list网址格式中的as_view()。
  2.   
  3. 但是,如果template_name属性未定义(我们从未在类定义中设置它),则as_view将忽略它。
  4.   
  5. 如果取消设置template_name并且开发人员忘记传递它,我们应该提出一个ImproperlyConfigured异常。
  6.   

你能帮我理解第2点和第3点吗? 第2点:

class PostList(View):
    #template_name = ''

    def get(self, request):


urlpatterns = [
    url(r'^$',
        PostList.as_view(template_name='blog/post_list.html'),

我得到" PostList()收到了无效的关键字' template_name'。 as_view只接受已经是该类属性的参数。在书中我读到没有任何事情会发生(" as_view将忽略它")。

第3点:

class PostList(View):
    template_name = ''

    def get(self, request):

url(r'^$',
        PostList.as_view(),
        name='blog_post_list'),

我在/ blog /"得到" TemplateDoesNotExist。                 提升TemplateDoesNotExist(template_name)...... ▶本地变种 template_name''

好吧,在书中它应该是一个NotperlyConfigured例外。

你能否评论一下:Django发生了一些变化,或者我没有按照这本书的说法。那么,我怎样才能模仿第2点和第3点的行为?

1 个答案:

答案 0 :(得分:1)

据我所知,这本书在第2点是错误的。 当您向as_view提供关键字参数时,会检查该类是否具有该属性,否则会抛出类似于您获得的TypeError。

另一个值得注意的问题是,您不能在as_view中使用任何http_method_names作为关键字参数。 (即get,post,put,delete等)因为这些是Django中基于类的视图的限制入口点。但是,您可以在自己的视图类中覆盖它们。

第3点我认为是一种误解。这本书实际上并没有说它会抛出错误,而是告诉你应该在这些情况下抛出一个不正确的配置。