MVC 패턴
장고의 뷰는 MVC패턴의 컨트롤러에 대응하는 부분이다.
뷰(View)
뷰는 클래스로 만드는 class-based-view 나 함수로 만드는 방식이 존재한다. 이번 글에서는 기초적인 함수형 뷰에 대해 소개하겠다. 뷰는 기본적으로 첫 번째 인자에 HttpRequest형의 객체를 일반적으로 request라는 이름으로 전달받는다. 이때 뷰의 이름은 임의로 정할 수 있다(임의로 정한 이름을 URL에 맵핑하기만 해 주면 되기 때문에).
# books/urls.py
from django.urls import path
from books import views
urlpatterns = [
path("/", views.index),
]
# books/views.py
def index(request: HttpRequest):
...
이렇게 request를 받아 뷰 내부적으로 동작한 뒤 response를 리턴해준다. response를 반환하는 방법은 여러 가지가 있는데, 기본적인 방법으로는 HttpReponse 객체를 반환하는 방법이 있다.
# books/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("이곳에 반환할 응답을 str로 작성한다.")
이렇게 작성했으면 서버를 가동하고, localhost:8000/books/로 접속하여 작동하는 것을 확인할 수 있다. HTML 양식에 맞춰 리턴하면 단순 문자열이 아닌 HTML문서로도 전달이 가능하다.
# books/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("<html><body>보통은 이런 방식보다는 템플릿을 사용</body></html>")
뷰에 인자를 받는 방법
URL path에 지정했던 인자를 뷰에서 받는 법을 알아보겠다.
# books/urls.py
urlpatterns = [
path("<int:book_id>/<str:book_name>/", views.index),
]
위와 같이 인자의 타입과, 전달할 이름을 작성해 준다.
def index(request, book_name: str, book_id: int):
ret = f"받은 int 인자값은: {book_id}, 받은 str 인자값은: {book_name}"
return HttpResponse(ret)
그리고 인자에 같은 이름으로 인자를 설정해 주면 값을 받아올 수 있다. 순서는 상관없으며 이름만 맞춰주면 된다.
http://localhost:8000/books/1/a/ 접속 예시
받은 int 인자값은: 1, 받은 str 인자값은: a
뷰에서 모델을 사용하기
뷰의 진정한 위력은 모델과 연결되었을 때 나온다. 2장에서 Book과 Author 모델을 만들고 migrate 한 후, 실제로 여러 작가의 데이터를 Author모델을 이용해 추가해 보았다. 이번에는 Book모델을 이용해 view에서 모델을 다루는 법을 알아보자.
우선 예시를 위해 사용했던 index뷰는 삭제해 주고, book관련 뷰와 URL을 추가해 주었다.
from django.urls import path
from books import views
urlpatterns = [
path("", views.books, name="books"),
path("<int:book_id>/", views.book_detail, name="book_detail"),
path("create/", views.create_book, name="create_book"),
]
# books/views.py
from django.http import HttpResponse
from books.models import Book
def books(request):
books = Book.objects.all()
return HttpResponse(books)
def book_detail(request, book_id):
book = Book.objects.get(id=book_id)
return HttpResponse(book)
def create_book(request):
Book.objects.create(title="빙과", page_count=256, author_id=1)
return HttpResponse("책 생성 완료")
books는 전체 책 목록을 보여주고, book_detail을 개별 책을 보여준다. create_book은 이름이 '빙과', 쪽수 256쪽, 작가 번호 1번(2장에서 모델 생성 시에 추가했던 '요네자와 호노부' 모델이다)을 가지는 책을 추가한다.
> http://localhost:8000/books/create/ 접속
책 생성 완료
> http://localhost:8000/books/create/ 접속
책 생성 완료
> http://localhost:8000/books/ 접속
Book object (1)Book object (2)
> http://localhost:8000/books/1/ 접속
Book object (1)
확실히 뭔가 생성된 것이 보이긴 한다. 그러나 책의 제목도, 작가도, 그 어느 정보도 확인할 수 없다. 책 제목이라도 확인할 수 있게 작성해 보자.
# books/views.py
from django.http import HttpResponse
from books.models import Book
def books(request):
books = Book.objects.all()
res = ""
for book in books:
res += f"{book.title} / {book.author.name}<br>"
return HttpResponse(res)
def book_detail(request, book_id):
book = Book.objects.get(id=book_id)
return HttpResponse(f"{book.title} / {book.author.name}")
def create_book(request):
Book.objects.create(title="빙과", page_count=256, author_id=1)
return HttpResponse("책 생성 완료")
> http://localhost:8000/books/ 접속
빙과 / 요네자와 호노부
빙과 / 요네자와 호노부
> http://localhost:8000/books/1/ 접속
빙과 / 요네자와 호노부
이제 좀 더 나은 화면을 볼 수 있다. 그러나 아직은 아쉽다. 좀 더 웹 화면을 편리하게 구성하고, 임의로 지정된 책 이름이 아닌, 내가 원하는 책을 직접 입력해서 데이터를 추가하고 싶다. 이를 위해 앞으로 템플릿과 폼을 알아보자.
여기까지 진행했을 때의 파일 구성: Github
'서버(Server) > 장고 (Django)' 카테고리의 다른 글
[Django Basic] 4. Template (0) | 2023.08.03 |
---|---|
dj-rest-auth 소셜 로그인(OAuth)에 대하여 (0) | 2023.07.27 |
DRF OAuth 라이브러리 비교 (0) | 2023.07.24 |
[Django Basic] 3.1. URL심화 (0) | 2023.07.15 |
[Django Basic] 3. URL, urls.py, URLConf, path (0) | 2023.07.15 |