【发布时间】:2016-07-28 19:34:00
【问题描述】:
当我(作为一个
Django初学者)未能
通过主键 pk 访问模型对象(来自 URL)
在我的FormView 子类中并试图了解如何
这样做正确。
很混乱。
那么关键字参数是如何在通用 CBV 中传递的? 应该如何处理和使用?
(我要自己回答,因为我发现并写了 为了正确理解它。)
【问题讨论】:
标签: django django-views django-class-based-views
当我(作为一个
Django初学者)未能
通过主键 pk 访问模型对象(来自 URL)
在我的FormView 子类中并试图了解如何
这样做正确。
很混乱。
那么关键字参数是如何在通用 CBV 中传递的? 应该如何处理和使用?
(我要自己回答,因为我发现并写了 为了正确理解它。)
【问题讨论】:
标签: django django-views django-class-based-views
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()。
(我编写调用括号来指示方法而不是数据属性;
空括号并不意味着没有参数。)dispatch() 查看请求并调用
get()、post()、head() 等,取决于请求类型,
再次传递参数。initkwargs 冗余存储在 vvv.view_initkwargs 中。
(尽量快点忘记这一点,您将很少需要它。)kwargs
被传递给各种请求处理方法
通用视图子类和视图混合类。
然而,这些类的结构会让你发疯。vanilla-views有
(1) initkwargs 来自
as_view() 视图工厂方法的单个关键字参数
最终将成为
CBV 类实例的各个属性
和
(2) kwargs 源于
urlconf 实例中的命名组
并最终作为
(2a) 关键字参数来调用您的
get() 和 post() 方法以及令人困惑的
(2b) CBV 类实例中的属性 kwargs。
那么你应该使用哪个,kwargs 参数还是属性?
This post
认为对于 CBV 和
它也会让你的代码更
统一,因为该论点并非在所有地方都可用
在 CBV 框架内。
这是混淆的最终来源:
kwargs 将不经常传递给那些方法
不过确实自己有一个kwargs参数...
尽可能首选self.kwargs 而不是kwargs 参数,不要让initkwargs 混淆您。
【讨论】: