django - 为什么可以在 "multiple ways"处导入UpdateView

标签 django django-generic-views

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

  • 1.从 django.views.generic 导入 UpdateView
  • 2.从 django.views.generic.edit 导入 UpdateView

我假设 2. 是正确的方法,而 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, <b>UpdateView</b>,
)
# ...

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

# ...

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

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

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

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

关于django - 为什么可以在 "multiple ways"处导入UpdateView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54052554/

相关文章:

python - 使用 Pylint 配置 ALE 插件

python - Django Python 'Customer' 对象不可迭代

Django数据库访问优化: Efficient creation of many-to-many relationships (between existing objects)

django - 如何在 Django 中使用基于日期的 View

Django 使用 UpdateView 上传文件

django - 对 FormView 中的 get_form_kwargs 感到好奇

python - 第 1 行 'cur_url' 列的数据被截断

django - 如何将 Django 文件字段中的文件添加到 url 和 View ?

django - 基于类的 View Django + Chartit 中的转换函数 View

django - 将使用捕获的 url 参数创建的表单传递给通用 django View ?