技术上不是Django的问题,更多的是python问题。Django子目录视图并从__init__.py导入所有文件
在urls.py我有以下几点:
urlpatterns = patterns('locate.views',
url(r'^', 'index.index'),
)
和目录结构是这样的:
locate/
views/
__init__.py
index.py # where there is "def index(request) : ...."
我想要做的是避免了不得不说的“指数。指数“,而是让事情平平一点。由此产生:
urlpatterns = patterns('locate.views',
url(r'^', 'index'),
)
当然这是很可能,如果我做__初始化__.py包含:
from .index import index
...
但是这样做,这将是不错的它自动化的第99次以后。我已经用一些关于__ import __之类的东西来关闭它,但是想知道是否有其他人有一个工作代码片段和/或更好的方法来在django中处理这种模式。
更新使用的版本的Amit的代码:
这是在views/__init__.py
文件(这将在短期内拉到库):
from glob import glob1
from types import FunctionType
import os
def import_views(dirname, views_prefix='') :
for filename in glob1(dirname, '*.py'):
if filename == '__init__.py': # I assume you don't want that
continue
module_name = os.path.basename(filename).split('.py')[0]
# You might need to change this, depending on where you run the file:
imported_module = __import__("%s.%s" % (__package__, module_name), fromlist=[module_name,])
idict = imported_module.__dict__
for method_name in idict.get('__all__', idict.keys()):
method = idict[method_name]
if not isinstance(method, FunctionType):
continue
if views_prefix and not method_name.startswith(views_prefix):
continue
globals()[method_name] = method
import_views(os.path.dirname(__file__))
,我不太清楚你的意思是......你想生成一个__init__.py文件或URL模式还是什么呢? – Joshkunz 2010-10-28 16:30:35
我想要__init__.py将所有* .py文件导入到它的名称空间中。因此,使诸如:locate.views.index有效的函数不是对模块的引用。 – koblas 2010-10-28 16:37:32
我认为这是不好的风格,你应该与'index.index'住在一起。其他任何事情都会在功能和模块之间造成混淆(对于您或他人)。 – katrielalex 2010-10-28 16:46:04