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

7 投票
2 回答
5836 浏览
提问于 2025-04-18 09:56

这是我简化后的看法:

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'
)

撰写回答