当我(作为一个人)时,我的危险已接近疯狂
Django初学者)没能
通过主键pk
访问模型对象(来自URL)
在我的FormView
子类中,并试图了解如何
这样做正确。
这令人困惑。
那么关键字参数如何在通用CBV中传递 应如何处理和使用?
(我要回答自己,因为我找到了并写下来了 为了正确理解它。)
答案 0 :(得分:4)
kwargs
与其他kwargs
... *args
传递给视图
并将命名组命名为**kwargs
。as_view()
函数将创建并返回
实际视图功能。kwargs
处理的第一件事:
在urls.py
中,当你写一些像
MyView.as_view(myarg=myvalue)
,
每个这样的关键字参数都将覆盖同名的类属性
CBV实例中的CBV类。
这些论点一起称为initkwargs
。vvv
)
是一个通用的
在django.views.generic.base中定义。
它实例化你的CBV,将initkwargs
传递给构造函数,
将request
,*args
和**kwargs
存储在同名中
CBV实例中的属性,
最后在实例上调用dispatch()
。request
,*args
和**kwargs
也将被冗余地直接传递给dispatch()
。
(我编写调用parens来指示方法而不是数据属性;
空的parens并不意味着没有争论。)dispatch()
查看请求和调用
get()
,post()
,head()
等,具体取决于请求类型,
再次传递论据。initkwargs
冗余地存储在vvv.view_initkwargs
中。
(尽量忘记这一点,你很少需要它。)kwargs
传递给各种各样的请求处理方法
通用视图子类和视图mixin类。
然而,那些班级的结构可能会让你发疯。
如果您对保持心理健康感兴趣,
我强烈建议使用vanilla-views
initkwargs
来自
as_view()
视图工厂方法的各个关键字参数
并将最终成为
CBV类实例的各个属性
和(2) kwargs
源于此
urlconf实例中的命名组
最终作为(2a)关键字参数调用您的
get()
和post()
方法以及令人困惑的方法
(2b) CBV类实例中的属性kwargs
。kwargs
参数或属性?
This post
认为使用该属性对于CBV更为自然
它还会使你的代码更多
统一,因为这个论点并非在所有地方都可用
在CBV框架内。kwargs
尽管如此做自己有一个kwargs
参数...... 道德:尽可能优先于self.kwargs
kwargs
论点,不要让initkwargs
迷惑你。