这是我的观点(简化):
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__
中所定义。
答案 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'