为什么以下两种导入 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/