여러 파일로 views.py 분할


153

views.py것이 너무 커져서 올바른 견해를 찾기가 어렵습니다.

여러 파일로 분할 한 다음 가져 오려면 어떻게합니까? 속도 손실이 있습니까?

내가 똑같이 할 수 있습니까 models.py?


4
큰 (7k 줄) views.py 파일을 파일로 분리하여 속도를 높이는 것이 중요했습니다.
user1261774

답변:


190

장고에서는 모든 것이 파이썬 모듈 (* .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 *

나는 실제로 속도 문제에 대해 알지 못합니다 (그러나 나는 의심합니다).

모델의 경우 약간 어려울 수 있습니다.


2
예제에서 view1 또는 view2와 일치하는 URL 패턴을 추가 할 수 있습니까? 내가 그것에 문제가 있기 때문에 ....
Pascal Klein

2
나는 이것을 시도했지만 (app.models에서 MyModel 또는 Model에서 MyModel 가져 오기) 내 모델을 가져올 때 Python은 모델이 존재하지 않는다고 불평합니다.
Chris Miller

루트 디렉토리에서 views.py를 삭제해도 괜찮습니까?
Roel

6
이 솔루션은 저에게 효과적이지 않습니다 (@ChrisMiller와 동일한 오류입니다. 내 솔루션 : in __init__.py: from myapp.views.viewsa import *. 더 이상 views.py를 가질 수 없습니다 (또는 적어도 @ShiftNTab을 읽을 수는 없습니다 : views.py에서 귀하의 의견을 찾는 것) 도움이
되길 바랍니다

명명 규칙은 어떻습니까? 파일 이름이 단수 또는 복수 여야합니까? 예 : views.car.pyviews.cars.py
guival

21

전에이 작업을 수행해야했습니다 (명확성을 위해).

내가 한 방법은 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;)


10

기본적으로 원하는 곳에 코드를 넣을 수 있습니다. 예를 들어의 뷰에 대해 import 문을 적절히 변경하십시오 urls.py.

실제 코드를 모르면 의미있는 것을 제안하기가 어렵습니다. 어쩌면 당신은 예를 들어 파일 이름 접두어, 어떤 종류의 사용할 수 있습니다 views_helper.py, views_fancy.py, views_that_are_not_so_often_used.py정도를 ...

또 다른 옵션은을 사용하여 views디렉토리 를 작성하는 것 입니다. __init__.py여기서 모든 하위보기 를 가져옵니다 . 많은 수의 파일이 필요한 경우 뷰가 증가함에 따라 중첩 된 하위 뷰를 더 만들 수 있습니다 ...


8

공유하기 위해 Vincent Demeester의 답변에 약간의 문제가있었습니다. init .py 파일을 제외하고는 모든 것이 정상입니다.이 방법으로 작성해야합니다.

__init__.py :

from .viewsa import *
from .viewsb import *

이 방법으로 여전히 importurls.py에서 내 메소드 를 변경할 필요가 없습니다. 저는 Python 3.6.1Django 1.11.4에 있습니다.


5

간단한 대답 : 그렇습니다.

가장 좋은 방법은 views라는 디렉토리를 만든 다음 urls.py에서 수행하는 것입니다.

import views
...
url(r'^classroom$', views.school.klass, name="classroom"),

1

내 응용 프로그램의 거의 모든 뷰를 뷰 폴더로 분할했습니다 ( 물론 init .py 사용). 그러나 일부 답변이 제안한 것처럼 init .py 의 모든 하위 뷰를 가져 오지 않습니다 . 잘 작동하는 것 같습니다.


1

Django는 뷰가 호출 가능한 객체 일 것으로 기대하기 때문에 PYTHONPATH에서 원하는 위치에 배치 할 수 있습니다. 예를 들어 myapp.views라는 새 패키지를 만들어 여러 모듈에 뷰를 넣을 수 있습니다. 자연스럽게 urls.py 및 이러한 뷰 콜 러블을 참조하는 다른 모듈을 업데이트해야합니다.


1
이것은 실제로 올바르지 않습니다. 모델로 수행 할 수 있습니다. 참조 : code.djangoproject.com/ticket/4470
Jonathan Berger

1
아, 알아 주셔서 감사합니다 :-) 항상 모델과 관련하여 조금 더 마술이 있고 앱 패키지에 어떻게 적용되는지 생각했습니다. 응답에서 모델에 대한 줄을 제거했습니다.
Horst Gutmann

기꺼이 도와 드릴 수 있습니다. 나중에이 링크가 모델을 통해 어떻게 더 잘 수행되는지 설명합니다 : blog.amber.org/2009/01/19/…
Jonathan Berger

1

나는 이것을 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))

저는 여전히 파이썬을 처음 사용하므로 속도 / 보안 / 사용 편의성에 어떤 영향을 미치는지 계속보고 있습니다.


1

password_generator.py다음과 같은 이름의 파일이 있다고 가정 views.py하십시오.from password_generator import *

그런 다음에서 해당 모듈의 기능을 호출 할 수 있습니다 views.py.


1

Vincent Demeester 의 답변은 훌륭합니다! 하지만 저에게는 중독 된 대답이 매력처럼 작용했습니다. 데이터베이스 를 마이그레이션하는 데 어려움이있었습니다 . 오류는 첫 번째 모델을 가져온 라인을 나타내며 내 앱 모듈을 인식 할 수 없습니다. 많이 검색했지만 해결책을 찾지 못했지만 나중에 다음과 같이 모델을 가져 왔습니다.

from ..models import ModelName

효과가 있었다 !!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.