[python] 여러 파일로 views.py 분할

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을 찾습니다

  1. views.py첫 번째 (원래) 사례에서 발생하는 것입니다.

  2. 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 *

이 방법으로 여전히 importurls.py에서 내 메소드 를 변경할 필요가 없습니다. 저는 Python 3.6.1Django 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 및 이러한 뷰 콜 러블을 참조하는 다른 모듈을 업데이트해야합니다.