답변:
장고에서는 모든 것이 파이썬 모듈 (* .py)입니다. __init__.py
내부가 있는보기 폴더를 만들 수 있으며 여전히 파이썬 모듈을 구현하기 때문에보기를 가져올 수 있습니다. 그러나 예가 더 좋습니다.
원본 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
파이썬에서 뷰 1을 찾습니다
views.py
첫 번째 (원래) 사례에서 발생하는 것입니다.
views/__init__.py
이는 두 번째 경우에 발생합니다. 여기 __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을 읽을 수는 없습니다 : views.py에서 귀하의 의견을 찾는 것) 도움이
views.car.py
대views.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
;)
기본적으로 원하는 곳에 코드를 넣을 수 있습니다. 예를 들어의 뷰에 대해 import 문을 적절히 변경하십시오 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))
저는 여전히 파이썬을 처음 사용하므로 속도 / 보안 / 사용 편의성에 어떤 영향을 미치는지 계속보고 있습니다.
Vincent Demeester 의 답변은 훌륭합니다! 하지만 저에게는 중독 된 대답이 매력처럼 작용했습니다. 데이터베이스 를 마이그레이션하는 데 어려움이있었습니다 . 오류는 첫 번째 모델을 가져온 라인을 나타내며 내 앱 모듈을 인식 할 수 없습니다. 많이 검색했지만 해결책을 찾지 못했지만 나중에 다음과 같이 모델을 가져 왔습니다.
from ..models import ModelName
효과가 있었다 !!