TIL 28. Django C.R.U.D #views.py, urls.py 작성

윤현묵·2021년 8월 20일
0

Django

목록 보기
4/17
post-thumbnail

이번에는 models.py 작성에 이어 views.py와 urls.py 작성법을 알아보겠습니다.

1. views.py와 urls.py의 역할

  • views.py
    -. 장고에서 View는 다른 일반 MVC Framework에서의 Controller와 비슷한 역할을 합니다.
    -. View는 필요한 데이터를 모델(model)에서 가져와서 적절히 가공하여 웹페이지 결과를 만들도록 컨트롤하는 역할을 합니다.
    (ex. Views.py에서 Front-End에서 오는 HTTP Request를 입력 parameter로 받아들이고, HTTP Response를 return해주는 View를 만들 수 있습니다.)
  • urls.py
    -. 장고 내에서 Web service를 제공하는데 url를 넘기기 전에 main 페이지와 각 app들과 url를 mapping 해주는 기능을 django ulrs.py에서 지원합니다.
    -. app들이 다양해지고 app하위에 또 다른 기능들이 생기면 main urls.py에서 모든 url를 mapping하지 않고 하위 app urls.py에 각 기능에 대한 url를 위탁할 수 있다.

2. views.py 작성

views.py는 models.py에서 작성한 class를 기반으로 각각에 해당하는 View 클래스를 작성합니다. 그리고 각 class내에는 post함수와 get함수를 작성하는데, post함수는 정보를 입력, get함수는 정보를 가져오는 역할을 합니다.
먼저 views.py 작성에 필요한 모듈을 모두 불러옵니다.

import json # json데이터를 처리하기 위해 import
from django.http import JsonResponse # django.http에서 서버의 요청에 대한 응답을 Json으로 응답하기 위해 JsonResponse import
from django.views import View # django.views에서 View import
from owners.models import Owner, Dog

그리고 각 클래스를 아래와 같이 작성합니다.

class OwnersView(View): # Django에 내장되어 있는 View class 상속
    def post(self, request):
        data = json.loads(request.body) # body부분의 문자열을 python 타입으로 변경

        Owner.objects.create(          # Owner의 객체를 생성(models.py에서 작성한 내용에 따라 작성
            name=data['owner'],
            email=data['owner_email'],
            age=data['owner_age']
        )
        return JsonResponse({'MESSAGE': 'CREATED'}, status=201)

    def get(self, request):
        owners = Owner.objects.all() # Owner의 모든 객체를 owners에 할당
        results = []                 # 결과값에 해당하는 리스트 생성
        for owner in owners:         # owners의 객체를 하나씩 불러옴(쿼리셋 풀림)
            dog_list = []            # dog의 리스트 생성
            results.append(          # 각 해당하는 owner의 값을 append
                {
                    "owner": owner.name,
                    "owner_email": owner.email,
                    "owner_age": owner.age,
                    "dog_list": dog_list,
                }
            )
            dogs = owner.dog_set.all()  # owner에서 dog를 불러오기 위해 역참조 _set.all() 사용
            for dog in dogs:
                dog_list.append(        # dog의 해당 값을 append
                    {
                        "dog_name": dog.name,
                        "dog_age": dog.age,
                    }
                )

        return JsonResponse({'results': results}, status=200)
        
class DogsView(View):
    def post(self, request):
        data = json.loads(request.body) # body부분의 문자열을 python 타입으로 변경
        Dog.objects.create(             # models.py의 Dog class에 해당하는 모든 객체 생성
            owner_id=data['owner_id'],
            name=data['dog'],
            age=data['dog_age']
        )
        return JsonResponse({'MESSAGE': 'CREATED'}, status=201)

    def get(self, request):
        dogs = Dog.objects.all()    # models.py의 Dog class에 해당하는 모든 객체를 불러옴
        results = []                # 결과값을 위한 리스트 생성
        for dog in dogs:            # 각 dog의 객체를 불러옴(쿼리셋 풀림)
            results.append(         # 해당 값을 append
                {
                    "owner": dog.owner.name,
                    "dog": dog.name,
                    "dog_age": dog.age
                }
            )
        return JsonResponse({'results': results}, status=200)        

views.py 작성이 끝나면 urls.py를 작성하여 연결해주어야 합니다.

3. urls.py 작성

먼저 app폴더에 urls.py를 생성해줍니다.(저의 경우 owners)
그 후 프로젝트 폴더의 urls.py와 app폴더의 urls.py를 서로 연결시켜 관리합니다.

# 프로젝트 폴더 내의 urls.py
from django.urls import path, include 

urlpatterns = [                 # - urlpatterns의 path함수는 url과 명령을 연결하는 역할을 합니다.
    path('owners', include('owners.urls')), # 경로가 owners인 경우 owners.urls로 연결하여 이동
]

# app 폴더 내의 urls.py 
from django.urls import path # django.urls의 path 가져오기
from django.urls.resolvers import URLPattern
from owners.views import DogsView, OwnersView # views.py에서 DogView, OwnersView class 가져오기

urlpatterns = [
    path('', OwnersView.as_view()), # 경로가 ''일때, OwnersView class에 as_view()함수를 실행 => http method가 get인지 post인지 delete인지 update인지등을 판별하여 함수를 실행 

    path('/dogs', DogsView.as_view()), #경로가 '/dogs'일때, DogsView class에 as_view()함수를 실행 => http method가 get인지 post인지 delete인지 update인지등을 판별하여 함수를 실행 
]
profile
진정성 있는 개발자를 꿈꾼다

0개의 댓글