본문 바로가기

Django/Django 기초

[Django] 3 - 11. views.py 파일 분리

이전포스트

 

[Django] 1. 개발 환경 설정 https://wroni.tistory.com/4

[Django] 2 - 1. URL과 View https://wroni.tistory.com/5

[Django] 2 - 2. 모델 https://wroni.tistory.com/6

[Django] 2 - 3. 장고 관리자 https://wroni.tistory.com/7

[Django] 2 - 4. 조회와 템플릿 https://wroni.tistory.com/8

[Django] 2 - 5. URL과 네임스페이스, 2 - 6. 데이터 저장 https://wroni.tistory.com/9

[Django] 2 - 7. 스태틱 https://wroni.tistory.com/10

[Django] 2 - 8. 부트스트랩 https://wroni.tistory.com/11

[Django] 2 - 9. 템플릿 상속 https://wroni.tistory.com/12

[Django] 2 - 10. 폼 https://wroni.tistory.com/13

[Django] 3 - 1. 네비게이션바 https://wroni.tistory.com/14

[Django] 3 - 2. 페이징 https://wroni.tistory.com/15

[Django] 3 - 3. 템플릿 필터, 3 - 4. 답변 개수 표시 https://wroni.tistory.com/16

[Django] 3 - 5. 로그인과 로그아웃 https://wroni.tistory.com/18

[Django] 3 - 6. 계정생성 https://wroni.tistory.com/19

[Django] 3 - 7. 모델 변경 https://wroni.tistory.com/20

[Django] 3 - 8. 글쓴이 표시 https://wroni.tistory.com/21

[Django] 3 - 9. 수정과 삭제 https://wroni.tistory.com/22

[Django] 3 - 10. 댓글 https://wroni.tistory.com/23


3 - 11. views.py 파일 분리

 

장고에 기능을 추가하게 되면 뷰 파일에 함수가 늘어나게 된다.

뷰 파일에 함수가 많아지면 관리하기가 힘들어지므로 views.py를 분리하여 개선할 것이다.

 

1. views.py 여러 파일로 분리

 

먼저 새로운 디렉터리를 만든다.

 

 

cd /projects/mysite/pybo

mkdir views

 

pybo 하위 디렉터리에 views 파일을 새로 생성한다.

 

함수에 따라 views. 디렉터리에 새로운 파일들을 만들 것이다.

 

파일명 기능 함수
base_views.py 기본관리 index, detail
question_views.py 질문관리 question_create, question_modify
question_delete
answer_views.py 답변관리 answer_create, answer_modify
answer_delete
comment_views.py 댓글관리 comment_create_question, ..., 
comment_delete_answer

 

base_views.py

 

파일 : C:\projects\mysite\pybo\views\base_views.py

from django.core.paginator import Paginator
from django.shortcuts import render, get_object_or_404

from ..models import Question

def index(request):
	(...생략...)

def detail(request, question_id):
	(...생략...)

 

pybo/views.py 파일에 있었던 index, detail 함수를 그대로 복사해서 붙여넣기 하면 된다.

import문에서 기존에 같은 위치에서 models를 import 하는 것이 아니므로 상위에 있는 models를 import 하려면

from ..models import Question로 해야 한다.

 

question_views.py

 

파일 : C:\projects\mysite\pybo\views\question_views.py

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone

from ..forms import QuestionForm
from ..models import Question

@login_required(login_url='common:login')
def question_create(request):
    (...생략...)

@login_required(login_url='common:login')
def question_modify(request, question_id):
    (...생략...)

@login_required(login_url='common:login')
def question_delete(request, question_id):
        (...생략...)

 

base_views.py에서 했던 것처럼 views.py에서 question_create, question_modify, question_delete 함수 복붙하면 된다.

import는 상위의 디렉터리에 있는 forms와 models를 import 해야 하기 때문에 ..forms, ..models로 import 하면 된다.

 

answer_views.py

 

파일 : C:\projects\mysite\pybo\views\answer_views.py

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone

from ..forms import AnswerForm
from ..models import Question, Answer


@login_required(login_url='common:login')
def answer_create(request, question_id):
   (...생략...)

@login_required(login_url='common:login')
def answer_modify(request, answer_id):
   (...생략...)

@login_required(login_url='common:login')
def answer_delete(request, answer_id):
   (...생략...)

 

 

comment_views.py

 

파일 : C:\projects\mysite\pybo\views\comment_views.py

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone

from ..forms import CommentForm
from ..models import Question, Answer, Comment


@login_required(login_url='common:login')
def comment_create_question(request, question_id):
      (...생략...)

@login_required(login_url='common:login')
def comment_modify_question(request, comment_id):
       (...생략...)
       
@login_required(login_url='common:login')
def comment_delete_question(request, comment_id):
   (...생략...)

@login_required(login_url='common:login')
def comment_create_answer(request, answer_id):
   (...생략...)

@login_required(login_url='common:login')
def comment_modify_answer(request, comment_id):
      (...생략...)

@login_required(login_url='common:login')
def comment_delete_answer(request, comment_id):
      (...생략...)

 

__init__.py

 

views 디렉터리에 __init__.py 파일을 다음과 같이 작성한다

 

파일 : C:\projects\mysite\pybo\views\__init__.py

from .base_views import *
from .question_views import *
from .answer_views import *
from .comment_views import *

 

pybo/views.py 삭제

 

마지막으로 pybo/views.py 파일을 삭제하면 분리가 끝난다.

 

 

cd /projects/mysite/pybo

del views.py

 

정상적으로 웹 서버가 동작하는지 확인하자.

 

 

2. URL 매핑시 views 함수 찾기 쉽도록 분리

 

장고는 디버깅할 때 ulrs.py 파일에서 URL에 매핑된 함수를 찾는 것으로 시작한다.

하지만 위에서 viws.py를 분리한 방법으로는 urls.py 파일에 매핑된 함수명만 알 수 있고 어떤 뷰 파일의 함수인지 알 수 없다.

views 디렉터리의 모든 뷰 파일을 찾아야 하는 불편함이 생긴다.

 

__init__.py 파일을 제거하고 pybo/urls.py에 views.index 대신 base_vies.index와 같이 전체 경로를 써줄 것이다.

 

views/__init__.py 파일 제거

 

 

cd /projects/mysite/pybo/views

del __init__.py

 

pybo/urls.py

 

파일 : C:\projects\mysite\pybo\urls.py

from django.urls import path

from .views import base_views, question_views, answer_views, comment_views

app_name = 'pybo'

urlpatterns = [

    # base_views.py
    path('', 
    base_views.index, name='index'),
    path('<int:question_id>/', 
    base_views.detail, name='detail'),

    # question_views.py
    path('question/create/', 
    question_views.question_create, name='question_create'),
    path('question/modify/<int:question_id>', 
    question_views.question_modify, name='question_modify'),
    path('question/delete/<int:question_id>/', 
    question_views.question_delete, name='question_delete'),

    # answer_views.py
    path('answer/create/<int:question_id>/',
    answer_views.answer_create, name='answer_create'),
    path('answer/modify/<int:answer_id>', 
    answer_views.answer_modify, name='answer_modify'),
    path('answer/delete/<int:answer_id>', 
    answer_views.answer_delete, name='answer_delete'),

    # comment_views.py
    path('comment/create/question/<int:question_id>/', 
    comment_views.comment_create_question, name='comment_create_question'),
    path('comment/modify/question/<int:comment_id>/', 
    comment_views.comment_modify_question, name='comment_modify_question'),
    path('comment/delete/question/<int:comment_id>/', 
    comment_views.comment_delete_question, name='comment_delete_question'),
    path('comment/create/answer/<int:answer_id>/', 
    comment_views.comment_create_answer, name='comment_create_answer'),
    path('comment/modify/answer/<int:comment_id>/', 
    comment_views.comment_modify_answer, name='comment_modify_answer'),
    path('comment/delete/answer/<int:comment_id>/', 
    comment_views.comment_delete_answer, name='comment_delete_answer'),

]

 

URL 매핑할 대 views.index를 base_views.index로 바꾸어서 모듈명이 표시되도록 하였다.

모듈명이 있어서 이제 쉽게 어떤 뷰 파일의 함수인지 알 수 있다.

 

config/urls.py

 

index에 해당되는 URL 매핑도 views 대신 base_views를 사용하도록 다음처럼 수정한다.

 

파일 : C:\projects\mysite\config\urls.py

from django.contrib import admin
from django.urls import path, include
from pybo.views import base_views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('pybo/', include('pybo.urls')),
    path('common/', include('common.urls')),
    path('', base_views.index, name='index'), #'/'에 해당되는 path
]

 


※ 본 내용은 django 공부 기록이며, 점프 투 장고를 참고하였습니다.

https://wikidocs.net/book/4223

 

점프 투 장고

**점프 투 장고 오프라인 책 출간 !! (2020.12)** * [책 구입 안내](https://wikidocs.net/105844)

wikidocs.net

 

'Django > Django 기초' 카테고리의 다른 글

[Django] 3 - 10. 댓글  (0) 2021.12.15
[Django] 3 - 9. 수정과 삭제  (0) 2021.12.15
[Django] 3 - 8. 글쓴이 표시  (0) 2021.12.14
[Django] 3 - 7. 모델 변경  (0) 2021.12.09
[Django] 3 - 6. 계정생성  (0) 2021.12.07