티스토리 뷰
이번 글에서는 저번 글과 이어서 북마크 애플리케이션을 개발합니다.
2020/01/01 - [전체보기] - 4. 북마크 애플리케이션 개발(1)
북마크 애플리케이션 개발
④ View 코딩
-
view
- URLConf에 매핑된 Callable Object
- 첫번째 인자로 HttpRequest 인스턴스를 받는다.
- 필히 HttpResponse 인스턴스를 리턴 해야함
- 크게 Function Based View (FBV)와 Class Based View (CBV)로 구분
이번에는 각 url pattern에 매핑될 view를 코딩할 차례입니다. Django에서는 클래스형 뷰와 함수형 뷰
총 2가지 형태의 뷰를 사용해서 개발할 수 있는데 여기서는 함수형 뷰를 사용할 것입니다.
views.py를 열어 다음과 같이 작성합니다.
from django.shortcuts import render, get_object_or_404
# Bookmark 테이블의 데이터를 가져오기 위해 models.py에서 Bookmark 클래스를 import
from .models import Bookmark
# Create your views here.
def BookmarkListView(request):
# Bookmark 테이블의 모든 Row를 가져옴. list 형태로 저장됨
bookmarks = Bookmark.objects.all()
# 데이터 확인용
for bookmark in bookmarks:
print("ID : {}, Name : {}, URL : {}".format(bookmark.id, bookmark.name, bookmark.url))
return render(request, 'bookmark_list.html', {'bookmarks': bookmarks})
def BookmarkDetailView(request, pk):
"""
Bookmark 테이블의 특정 Row만 가져오는 방법 두 가지
1. get_object_or_404(): 객체가 존재하지 않을 때 Http 404 예외를 발생
- 하나의 오브젝트만 받을 수 있으므로 주의
- Django 모델을 첫번째 인자로 받고, 키워드 인수들을 모델 관리자의 get() 함수에 넘김
2. models.py에 정의된 모델 클래스를 직접 사용
"""
# 인자로 들어온 pk값과 테이블의 pk값이 같은 행만 가져옴
bookmark1 = get_object_or_404(Bookmark, pk=pk)
bookmark2 = Bookmark.objects.get(pk=pk)
# 데이터 확인용
print("ID : {}, Name : {}, URL : {}".format(bookmark1.id, bookmark1.name, bookmark1.url))
print("ID : {}, Name : {}, URL : {}".format(bookmark2.id, bookmark2.name, bookmark2.url))
return render(request, 'bookmark_detail.html', {'bookmark': bookmark2})
-
BookmarkListView(request)
: 모든 북마크들을 보여줘야 하므로 Bookmark 테이블에 저장된 모든 데이터를 가져옴.
-
BookmarkDetailView(request, pk)
: 사용자가 선택한 북마크에 대한 것만 보여줘야 함. 따라서, 사용자로부터 온 url의 pk 인자를 가져
와 이 값과 일치하는 pk 값을 가진 row만 가져옴.
-
render(request, template_name, context)
: 템플릿에 context를 채워넣어 표현한 결과를 HttpResponse 객체와 함께 돌려주는 함수
- 여기서 context는 템플릿에 전달할 데이터이며, Dict 형태로 전달해야 함
- {템플릿에서 사용할 변수명: 뷰에서 정의된 변수명,}
⑤ Template 코딩
이제 마지막으로 북마크 리스트 페이지와 북마크 상세페이지의 템플릿 파일을 코딩합니다.
각 페이지 별로 템플릿 파일이 하나씩 필요하므로 이들을 한 곳에 모아두기 위한 템플릿 디렉토리가
필요합니다. 다음과 같이 자신이 만들고 있는 애플리케이션 디렉토리 하위에 템플릿 디렉토리를
생성합니다.
다음과 같은 창이 뜨면 디렉토리 이름을 templates 로 입력하여 생성합니다.
그 후 templates 디렉토리 하위에 HTML 파일을 새로 생성합니다.
다음은 bookmark_list.html 파일 코드입니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Bookmark List</title>
</head>
<body>
<div>
<h1>Bookmark List</h1>
<ul>
{% for bookmark in bookmarks %}
<li><a href="{% url 'detail' bookmark.id %}"> {{bookmark}} </a></li>
{% endfor %}
</ul>
</div>
</body>
</html>
템플릿은 순수하게 HTML로만 쓰여질 수도 있지만, 대부분의 경우 뷰로부터 데이터를 전달받아
이를 템플릿 파일 안에 동적으로 적용합니다. 또한 Django 템플릿 태그를 사용하여 HTML 파일에
다양한 로직과 함께 뷰에서 전달받은 데이터를 템플릿에서 편리하게 사용할 수 있습니다.
-
{% ~ %}: Django 템플릿 태그
-
{{변수명}}: 뷰에서 전달받은 해당 변수를 적용할 곳
<a href="{% url 'detail' bookmark.id %}"> {{bookmark}} </a>
이 코드를 보면 url 주소를 써야하는 부분에 {% url %} 를 이용하여 작성되어 있습니다.
여기서 'detail'은 urls.py에 명명된 url pattern 이름(name)에 해당됩니다.
우리는 'detail' url pattern 에서 pk 값을 받아오기로 정의했기 때문에 어떠한 값을 url에 넣어 보내줘야
합니다. 이를 위해 bookmark.id 값을 받아 url이 '/bookmark/1/' 로 재구성되어 request가 서버로 보내집니다.
이렇게 url 태그를 이용하면 url을 하드코딩할 필요가 없기 때문에 더 편리하고 유지보수에도 좋습니다.
{% for bookmark in bookmarks %}
<li><a href="{% url 'detail' bookmark.id %}"> {{bookmark}} </a></li>
{% endfor %}
여기서 {{bookmark}}는 Bookmark 테이블에서 가져온 여러 row 중 하나의 row의 정보를 담은 객체입니다.
따라서 bookmark.id, bookmark.title, bookmark.url 이런 방식으로 각 row에 대한 컬럼 값을 접근할 수 있습니다.
그런데 {{ bookmark }} 는 특정 컬럼을 지정하지 않고 변수 안에 들어 있는 값을 출력하라고만 코딩이 되어 있습니다.
이 경우 우리가 Bookmark 모델에서 정의했던 str() fuction을 내부적으로 call 합니다.
그래서 결과 화면에 해당 row의 name 값이 보여지는 것입니다.
북마크 상세페이지의 템플릿 파일도 다음과 같이 코딩합니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Bookmark Detail</title>
</head>
<body>
<div>
<h1>{{bookmark}}</h1>
<ul>
<li> URL : <a href= '{{bookmark.url}}'>{{bookmark.url}}</a></li>
</ul>
</div>
</body>
</html>
⑥ 결과 화면 확인하기
테스트 서버를 실행시켜 북마크 페이지가 제대로 구현되었는지 확인합니다.
- 북마크 리스트 페이지
- 북마크 상세페이지
참고 자료
- Django를 활용한 쉽고 빠른 웹 개발 파이썬 웹 프로그래밍
- https://wayhome25.github.io/django/2017/03/19/django-ep3-fbv/
'Django' 카테고리의 다른 글
[Django App 2-2] Django와 MySQL 연동하기 (0) | 2020.01.07 |
---|---|
[Django App 2-1] 북스토어 애플리케이션 개발 (0) | 2020.01.07 |
[Django App 1-2] 북마크 애플리케이션 개발(1) (0) | 2020.01.01 |
[Django App 1-1] 북마크 애플리케이션 설계 (0) | 2019.12.29 |
[Django Basic 03] Django 프로젝트 생성(2) (0) | 2019.12.18 |
- Total
- Today
- Yesterday
- python
- Django 로그아웃
- 장고
- Django 좋아요
- Django 프로젝트 생성
- Django User
- Django
- Django 검색
- 서점 어플리케이션
- Django 회원가입
- java
- Django application
- 북마크 어플리케이션
- Redis Cache
- Django Instagram
- Django 컬렉션
- query parameter
- Django 팔로우
- Django 비밀번호 수정
- 파이썬
- Django 업로드
- Django 어플리케이션
- Django 로그인
- Django 해시태그
- Redis
- Django 북마크
- Django 인스타그램
- Django 댓글
- MySQL
- Django 회원 정보 수정
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |