【问题标题】:Handling of kwargs keyword arguments in Django class-based views (CBVs)在 Django 基于类的视图 (CBV) 中处理 kwargs 关键字参数
【发布时间】:2016-07-28 19:34:00
【问题描述】:

当我(作为一个 Django初学者)未能 通过主键 pk 访问模型对象(来自 URL) 在我的FormView 子类中并试图了解如何 这样做正确。 很混乱。

那么关键字参数是如何在通用 CBV 中传递的? 应该如何处理和使用?

(我要自己回答,因为我发现并写了 为了正确理解它。)

【问题讨论】:

    标签: django django-views django-class-based-views


    【解决方案1】:

    不要将kwargs 与其他kwargs 混淆...

    • 请记住,视图最终始终是函数。 您可能还记得"How Django processes a request", 来自 urlconf 正则表达式的未命名组将作为 *args 传递给视图 并将组命名为**kwargs
    • 但对于 CBV,该视图的实际功能不太明显 是或它做了什么,因为这隐藏在 Django 的深处。 您可能还记得"Using class-based views", CBV 的 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
      作为 Django 内置的通用 CBV 的替代品。 该软件包以非常简单的形式提供了相同的功能。

    总结一下


    (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 混淆您。

    【讨论】:

    • 对于我们这些新手来说,一些代码示例很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2013-04-13
    相关资源
    最近更新 更多