Django - 在TemplateView中传递属性值给as_view
这是我简化后的看法:
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
设置为在 as_view
中传入的值 'baz'
。如果在 as_view
中没有任何属性,那么这个值应该是 'bar'
,这是在 __init__
中定义的。
2 个回答
3
Django的View
类的源代码中有这么一段:
if not hasattr(cls, key):
raise TypeError
所以,仅仅在__init__
方法中为一个实例创建属性是不够的……这个属性必须在类本身上就存在:
class MyView(TemplateView):
foo = 'bar'
9
你在 __init__()
方法里明确给这个类的一个实例设置了一个值。但是,这个类本身并没有一个叫 foo
的属性,因为它不知道实例上有动态属性:用 hasattr(MyView, 'foo')
检查时,总是返回 False
。
下面的代码会按照你预期的那样工作:
class MyView(TemplateView):
foo = 'bar'
url(
r'^/foo/$',
MyView.as_view(foo='baz'), name='my_view'
)