현재 우리의 페이지는 글로만 이루어져 있다.
이런 블로그는 아무도 관심을 가지지 않는다! 읽는 재미도 없다.
따라서 우리는 각 게시글에 사진을 올릴 수 있는 기능을 만들 예정.
그전에, 동적 페이지 / 정적 페이지라는 개념이 있다.
이게 뭔디?
정적 페이지 : 정적인 거! 사전에 준비된 데이터밖에 띄워주지 못함.
동적 페이지 : 동적인 거! 활발한 거! 사전 준비 데이터 이외에 이용자가 입력한 데이터도 띄워줄 수 있음.
으로 생각하면 쉽겠다.
우리는 일반 이용자도 게시글과 사진을 올리게 해 줄 테니 나름 동적인 페이지라고 할 수 있다. 와우!
동적인 페이지를 향한 첫 번째 발걸음.
1. static 폴더 만들기
blogs 앱 안에 static이라는 폴더를, 그 안에는 image라는 폴더를 만들자.
image 파일은 올리고 싶은 사진을 아무꺼나 넣어주자.
2. template에서 static 사용하기.
글 목록이 표시되는 페이지에 해당 사진을 넣어보도록 하자.
post_all.html
맨 위 두 줄을 보면 된다!
{% load static %}을 통해 staic 파일과 폴더를 사용할 수 있도록 템플릿 상에 불러와줬다.
이미지를 불러오기 위해 img태그를 사용한 건 익숙하지만...
src로 static을 사용하기 위해 템플릿 태그 {%%} 를 사용해줬다!
즉 static의 image폴더의 파일 명 ← 요 녀석을 불러와달라...고 요청한 것!
으잉? 이미지를 불러오는 데 실패할 경우 자동적으로 저런 사진이 뜬다.
당황하지 말고 서버를 한 번 껐다가 다시 runserver!
사진이 엄청 큰 것 같긴 하지만... 어쨌든 성공!
3. settings 설정하기
settings.py
settings.py에 요 두 줄을 추가해주자!
STATIC_URL → 요 놈은 우리가 static 요소들을 사용하기 위해 요청하는 URL.
STATIC_ROOT → 요 녀석은 배포 단계에서 앱 별로 흩어져있는 static 요소들을 한 곳에 모아주기 위한 것.
배포 시 collectstatic을 통해 설정해준 STATIC_ROOT 경로로 한 번에 모아서 관리한다.
4. model에서 image 파일 받기
게시글을 작성할 때 사진도 첨부할 수 있으면 얼마나 좋을까!
models.py
게시글을 담당하는 Post 모델 안에 image 필드를 만들어주자.
저 한 줄 적었는데 에러가 나온다!
당황하지 않고 읽어보니 pillow라는 녀석을 설치하란다. 해주자.
모델 필드에 새로운 녀석을 추가했으니 makemigrations - migrate 세트도 착착.
그럼 이렇게 Admin 페이지에서 Post를 추가할 때 Image 파일을 넣을 수 있는 공간이 생긴다.
5. form에서 Image 파일 받기
Admin에서밖에 Image 파일을 추가할 수 없다면... CRUD를 구현한 의미가 없다.
이용자가 게시글을 생성할 때, 즉 C / U 단계에서도 Image를 입력할 수 있도록 하자.
forms.py
이용자가 게시글을 입력할 때 사용되는 틀인 PostCreateForm에서 image 필드도 입력받도록 하자!
post_form.html
다음으로 게시글을 작성하는 post_form.html에서 form 태그 속성으로enctype="multipart/form-data" 를 넣어주자.
이를 통해 첨부한 파일이 form을 통해 제대로 넘어갈 수 있도록 한 것!
제일 밑에 form.image를 적어 Image도 제출할 수 있도록!
views.py
게시글을 작성하는 PostCreateView에서 PostCreateForm에 담긴 FILES도 함께 넣어주면 된다!
6. settings / urls 작성
settings.py
settings에서 아까 적은 static 밑에 요 녀석들도 적어주자.
static과 유사한 흐름! 이번에는 사용자가 media 파일들을 보기 위해 요청하면 사용된다.
urls.py
우리는 project 내에 urls.py를 만들어 include 했기 때문에 project의 urls.py에도 저 내용을 적어줘야 한다!
7. 게시글 detail에서 보여주기
마지막으로 제출받은 Image도 detail페이지에서 볼 수 있도록 하자.
post_detail.html
if 문을 통해 각 게시글에 image가 있을 경우 → 해당 게시글 이미지의 url을 띄워주기로!
쨔쟌. 게시글을 작성할 때 첨부한 사진이 detail 페이지에서 잘 뜬다.
'source-code > Django' 카테고리의 다른 글
Blogs App _ CSS 확장하기 (0) | 2021.01.11 |
---|---|
Blogs App _ 좋아요 기능 (0) | 2021.01.10 |
Blogs App _ 인증 기능 with 사용자 지정 (0) | 2021.01.07 |
Blogs App _ CRUD with 함수형 (0) | 2021.01.06 |
Blogs App _ CRUD (0) | 2021.01.05 |