回答:
Djangoでは、すべてがPythonモジュール(* .py)です。__init__.py
内部にビューフォルダーを作成しても、Pythonモジュールが実装されているため、ビューをインポートできます。しかし、例はより良いでしょう。
オリジナルviews.py
は次のようになります。
def view1(arg):
pass
def view2(arg):
pass
次のフォルダ/ファイル構造で同じように動作します:
views/
__init__.py
viewsa.py
viewsb.py
viewsa.py
:
def view1(arg):
pass
viewsb.py
:
def view2(arg):
pass
__init__.py
:
from viewsa import view1
from viewsb import view2
迅速な説明は次のようになります。あなたが書いたときにfrom views import view1
PythonがVIEW1で探します
views.py
、これは最初の(元の)ケースで何が起こるか
views/__init__.py
、これは2番目のケースで何が起こるかです。ここで__init__.py
は、view1メソッドをインポートするため、それを提供できます。
この種類のソリューションでは、引数を変更しimport
たり、urlpattern
引数を指定したりする必要がない場合があります。urls.py
新しいビューファイルごとに多くのメソッドがある場合、次のように、インポートをviews/__init__.py
使用中にすると便利な場合があります*
。
from viewsa import *
from viewsb import *
私は実際には速度の問題については知りません(しかし、何かがあるとは思えません)。
モデルの場合、少し難しいかもしれません。
__init__.py
:from myapp.views.viewsa import *
。views.pyをもう使用できないことに注意してください(または、少なくとも@ShiftNTabを読み取れません):Not for not views.pyであなたの意見を見つけてください。それが役に立てば
views.car.py
vsviews.cars.py
私は以前にこれをしなければなりませんでした(明確にするために)
私がこれをした方法は、views
ディレクトリを作成し、その中に、というファイルを作成することでした__init__.py
これで、で呼び出すときurls.py
に、別のパーツを追加するだけです
たとえば、以前は次のように呼び出した可能性があります。
url(r'^calendar/(?P<year>\d\d\d\d)/$', 'myproject.calendar.views.year')
url(r'^calendar/(?P<year>\d\d\d\d)/(?P<user>[a-z]+)/$', 'myproject.calendar.views.year_by_user')
これで、次のように何かを呼び出すことができます
url(r'^calendar/(?P<year>\d\d\d\d)/$', 'myproject.calendar.views.year.index')
url(r'^calendar/(?P<year>\d\d\d\d)/(?P<user>[a-z]+)/$', 'myproject.calendar.views.year.user')
もちろん、これは、views/year.py
関数index
とuser
;)が含まれていることを前提としています。
基本的に、コードはどこにでも置くことができます。必ず確認してくださいurls.py
。たとえば、のビューの場合は、それに応じてインポート文を変更してください。
実際のコードがわからないため、意味のあるものを提案するのは困難です。たぶん、あなたは例えば、ファイル名の先頭のいくつかの種類を使用することができviews_helper.py
、views_fancy.py
、views_that_are_not_so_often_used.py
またはそう...
別のオプションは、すべてのサブビューをインポートviews
する__init__.py
でディレクトリを作成することです。多数のファイルが必要な場合は、ビューが大きくなるにつれてネストされたサブビューをさらに作成できます...
アプリのほとんどすべてのビューをビューフォルダーに分割します(もちろんinit .pyを使用)。ただし、一部の回答が示唆しているように、init .pyのすべてのサブビューをインポートしません。正常に動作するようです。
Djangoはビューが呼び出し可能なオブジェクトであることを期待しているだけなので、PYTHONPATHの好きな場所に置くことができます。たとえば、新しいパッケージmyapp.viewsを作成して、そこにある複数のモジュールにビューを配置することができます。当然、これらのビューの呼び出し可能オブジェクトを参照するurls.pyおよびその他のモジュールを更新する必要があります。
私はこれを私のinit .pyに入れて遊んでいます:
import os
currPath = os.path.realpath(os.path.dirname(__file__))
dirFiles = []
for root, dirs, files in os.walk(currPath):
for name in files:
if name.endswith('.py') and not name.startswith('_'):
dirFiles.append(name.strip('.py'))
for f in dirFiles:
exec("from %s import %s" % (f,f))
私はまだpythonを使ったことがないので、速度、セキュリティ、使いやすさへの影響を調べています。
Vincent Demeesterの答えはすばらしいです。しかし私にとっては、中毒の答えは魅力のように働きました。データベースの移行に苦労しました。このエラーは、最初のモデルがインポートされた行を示し、アプリモジュールを認識できなかったことを示しています。多くを検索しましたが、解決策は見つかりませんでしたが、後で次のようにモデルをインポートしました。
from ..models import ModelName
出来た!!