내 views.py
것이 너무 커져서 올바른 견해를 찾기가 어렵습니다.
여러 파일로 분할 한 다음 가져 오려면 어떻게합니까? 속도 손실이 있습니까?
내가 똑같이 할 수 있습니까 models.py
?
답변
장고에서는 모든 것이 파이썬 모듈 (* .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 *
나는 실제로 속도 문제에 대해 알지 못합니다 (그러나 나는 의심합니다).
모델의 경우 약간 어려울 수 있습니다.
답변
전에이 작업을 수행해야했습니다 (명확성을 위해).
내가 한 방법은 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
여기서 모든 하위보기 를 가져옵니다 . 많은 수의 파일이 필요한 경우 뷰가 증가함에 따라 중첩 된 하위 뷰를 더 만들 수 있습니다 …
답변
공유하기 위해 Vincent Demeester의 답변에 약간의 문제가있었습니다. init .py 파일을 제외하고는 모든 것이 정상입니다.이 방법으로 작성해야합니다.
__init__.py :
from .viewsa import *
from .viewsb import *
이 방법으로 여전히 import
urls.py에서 내 메소드 를 변경할 필요가 없습니다. 저는 Python 3.6.1 및 Django 1.11.4에 있습니다.
답변
간단한 대답 : 그렇습니다.
가장 좋은 방법은 views라는 디렉토리를 만든 다음 urls.py에서 수행하는 것입니다.
import views
...
url(r'^classroom$', views.school.klass, name="classroom"),
답변
내 응용 프로그램의 거의 모든 뷰를 뷰 폴더로 분할했습니다 ( 물론 init .py 사용). 그러나 일부 답변이 제안한 것처럼 init .py 의 모든 하위 뷰를 가져 오지 않습니다 . 잘 작동하는 것 같습니다.
답변
Django는 뷰가 호출 가능한 객체 일 것으로 기대하기 때문에 PYTHONPATH에서 원하는 위치에 배치 할 수 있습니다. 예를 들어 myapp.views라는 새 패키지를 만들어 여러 모듈에 뷰를 넣을 수 있습니다. 자연스럽게 urls.py 및 이러한 뷰 콜 러블을 참조하는 다른 모듈을 업데이트해야합니다.