Django - 在TemplateView中将属性值传递给as_view

时间:2014-06-16 12:54:26

标签: python django django-templates

这是我的观点(简化):

class MyView(TemplateView):
    def __init__(self):
        self.foo = 'bar'
        super(MyView, self).__init__()

这是在urls.py中:

url(
    r'^/foo/$',
    MyView.as_view(foo='baz'), name='my_view'
)

当我运行它时,我收到以下错误:

TypeError: MyView() received an invalid keyword 'foo'. as_view only accepts arguments that are already attributes of the class.

为什么?我认为这会奏效。 :/

至少根据这篇文章: http://reinout.vanrees.org/weblog/2011/08/24/class-based-views-walkthrough.html#class-view

如果我理解正确,则应将属性foo设置为'baz'中传递的值as_view。如果as_view中没有任何属性,则值应为'bar',如__init__中所定义。

2 个答案:

答案 0 :(得分:4)

您在__init__()中明确设置了该类实例的值。但是,类本身仍然没有属性foo,因为它不知道实例上的动态属性:hasattr(MyView, 'foo')始终返回False

这可以正常运行,因为您希望代码能够正常工作:

class MyView(TemplateView):
    foo = 'bar'

url(
    r'^/foo/$',
    MyView.as_view(foo='baz'), name='my_view'
)

答案 1 :(得分:1)

Django View类的源代码虽然有这个:

if not hasattr(cls, key):
    raise TypeError

因此,在__init__中的实例上创建attr是不够的......它必须存在于类本身上:

class MyView(TemplateView):
    foo = 'bar'