【问题标题】:Why can you import UpdateView in "multiple ways"为什么可以“多种方式”导入UpdateView
【发布时间】:2019-01-05 13:37:03
【问题描述】:

为什么以下两种导入 UpdateView 的方式都有效?:

  • 1。从 django.views.generic 导入更新视图
  • 2。从 django.views.generic.edit 导入更新视图

我假设 2. 是正确的方法,而 1. 行不通,但通过测试两者都可以。

【问题讨论】:

  • django.views.generic__init__,这只是“重新导出”edit.py 等中定义的类。

标签: django django-generic-views


【解决方案1】:

您在此处看到的内容很常见(至少在一些 Python 包中)。如果你定义了一个.py 文件,它就充当了一个模块。例如django.views.generic.edit 模块映射到django/views/generic/edit.py file [GitHub]

目录也是一个 Python 模块(由于 __init__.py 文件),但默认情况下它不包含任何元素,因此这意味着 django.views.generic 将为空。

如果我们看一下django/views/generic/__init__.py file [GitHub],我们会看到:

from django.views.generic.base import RedirectView, TemplateView, View
# ...
from django.views.generic.edit import (
    CreateView, DeleteView, FormView, UpdateView,
)
# ...

__all__ = [
    'View', 'TemplateView', 'RedirectView', 'ArchiveIndexView',
    'YearArchiveView', 'MonthArchiveView', 'WeekArchiveView', 'DayArchiveView',
    'TodayArchiveView', 'DateDetailView', 'DetailView', 'FormView',
    'CreateView', 'UpdateView', 'DeleteView', 'ListView', 'GenericViewError',
]

# ...

因此,这会从generic.py 文件中导入UpdateView,然后重新导出该类。

因此,您可以通过两种方式引用该类:通过generic.py文件定义的模块,或通过__init__.py文件指定的目录模块的重新导出。

这通常用于导出文件中定义的项目的部分,以更方便的名称导出这些项目,或在模块级别提供一些额外的类(例如 @ 987654334@ 文件定义了GenericViewError 错误)。

因此,此目录级模块将有趣的视图“组合”在一起。例如,FormMixin 在此级别导出。 __init__.py 这里将(流行的)基于类的视图组合在一起,而通常用于定义此类通用视图的 mixin 仍然特定于文件。

【讨论】:

    猜你喜欢
    • 2021-07-19
    • 2012-05-07
    • 2016-06-05
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    相关资源
    最近更新 更多