안녕하세요! 멋쟁이사자처럼 8기 산와머니입니다!
오늘의 주제는 무엇이냐 ! 저번 시간에 CREATE구현에 이어 READ 구현을 해보려고 합니다!
이번 과제는 난관에 난관이었네요 ㅠ_ㅠ
항상 도와주시는 운영진분들께 감사인사를 드리며 오늘도 과제 복습을 시작하겠습니둥!!!
앗 아직 전 포스트를 보지 못하셨다구요?
1. 사전 셋팅
1-1. 가상환경 셋팅
https://tksgk2598.tistory.com/75?category=1016993
1-2. Django 셋팅
https://tksgk2598.tistory.com/77?category=1016993
1-3. 블로그 템플릿작성
https://tksgk2598.tistory.com/78?category=1016993
1-4. 블로그 모델, 뷰를 이용한 CREATE구현
https://tksgk2598.tistory.com/79?category=1016993
1-5. 포스트 들어가기 전 알아야 할 키워드
Django는 3가지로 이루어져 있습니다. (쓰임새는 아래에서 같이 확인)
M:MODEL
V:VIEW
T:TEMPLATES
MVT를 잘 활용하여 다음과 같은 기능을 구현할 것 입니다.
C:CREATE
R:READ
U:UPDATE
D:DELETE
2. 블로그 글 읽을 수 있는 READ 기능을 구현해봅시다.
READ는 메인에서 내가 쓴 글을 읽을 수 있게 해 줄 겁니다.
네이버 블로그도 제가 어떤 글을 쓴 것을 여러분들이 눌러서 읽을 수 있듯이 말이죠!
그러므로 일단 TEMPLATES에 index.html을 만들어 줄 겁니다.
먼저, 간단한 코드를 보고 오시죠!
모든 소스코드는 깃에서 확인해주세요.
https://github.com/SahhaShin/django_blog/tree/master/blog_project/blog_app/templates/temp
2-1. index.html 파일을 templates폴더에 만들어주세요.
>그리고 git에서 index.html을 복붙해주세요. 주요코드는 url, view에 연결 후 설명해드리도록 하겠습니다.
2-2. index.html의 url을 연결하고, view에서 어떻게 행동할지 처리합시다. 즉 메인에서 전체 포스트를 불러오는 방법을 알아봅시다.
>urls.py에 path('index/', views.index, name='index'), 를 추가해줍니다.
>views에 아래의 첨부된 코드를 추가해줍니다.
>코드 설명을 잠깐 해드리도록 하겠습니다.
>여러분 git코드에는 temp 경로가 있지만 아래의 코드처럼 temp를 제거해주세요.
>코드설명 시작
#전체 게시글 페이지
def index(request):
if Post.objects is not None:
content=Post.objects
return render(request,'index.html',{'check':content})
else:
return render(request,'index.html')
>if Post.object is not None 이라는 뜻은 모델에 추가한 Post라는 모델의 object에 저장된 객체가 1개라도 있다면 이라는 뜻입니다.
>1개라도 있다면 content라는 변수에 Post 객체들을 모두 저장합니다.
>저장 후 index.html에 모든 Post 객체들을 저장한 content라는 변수를 check라는 이름으로 전달해줄겁니다.
>그런 다음 제 블로그처럼 제가 적은 글이 저장된 모든 Post들이 나오겠죠.
>다음과 같이 이전 포스트에서 같이 작성했던 첫번째 게시물이 보입니다.
>만약에 Post에 객체들이 아무것도 없으면 즉 저번 포스트에 따라서 글 생성을 안하셨다면 그냥 아무 글도 없는 메인페이지를 보여 줄 예정입니다.
2-3. index.html의 주요코드를 설명드리겠습니다.
<!--글 불러오기-->
<table>
{% for turn in check.all %}
<hr style="margin-left: 10%;margin-right: 10%;">
<tr>
<div class="table_wich" style="font-weight: bold; margin-top: 3%;"><a href="/{{turn.id}}">{{turn.subject}}</a></div>
</tr>
<tr>
<div class="table_wich" style="margin-bottom: 3%;"><a href="/{{turn.id}}">{{turn.memo}}</a></div>
</tr>
{% endfor %}
</table>
>사용자가 어떤 블로그의 글을 눌렀을 때 그 블로그에 특정 글에 대한 내용을 사용자에게 보여줘야겠죠?
>저희는 방금 위에서 views.py에 Post의 저장 된 모든 객체를 contents라는 변수에 저장 후 index.html에 check라는 이름으로 전달해줬던거 기억하시나용?
>때문에 index.html에서도 check를 이용해 블로그 주인이 쓴 모든 게시글을 표시해 줄 예정입니다.
>Django는 파이썬 언어를 기반으로 하기 때문에 파이썬 언어를 써주셔야 합니다. 때문에 {% %} 이 사이에 명령어를 입력해주도록합니다. {% for turn in check.all %} 이 뜻은 check에서 가져 온 모든 객체들을 하나 씩 turn이라는 변수에 넣어준다는 이야기 입니다.
>코드와 함께 봐주면 내가 썼던 글이 for문을 돌아가면서 모델에 있던 모든 turn.subject, turn.memo가 메인페이지에 표시되는 것을 볼 수 있습니다.
2-4. 이젠 블로그 주인이 쓴 글 중 단 하나의 포스트를 선택해서 그 안의 내용을 볼 때 하나의 포스트를 READ하는 방법을 보겠습니다. (specific.html 만들기)
>바로 위에서 저는 href 부분을 설명해드리지 않았습니다. 여기서 설명드릴 것이기 때문이죠!
>예를 들어 백준의 전체문제 페이지를 보시면 https://www.acmicpc.net/problemset
>문제 번호마다 뒤에 페이지 번호가 붙는 것을 볼 수 있습니다.
>제가 캡쳐한 페이지는 1000번 문제라 맨뒤에 1000이 붙은 것을 보실 수 있죠?!
>이 처럼 블로그 포스트도 몇 번 째 포스팅, 포스트냐에 따라 숫자가 붙고 그 포스팅 숫자에 맞는 글 만을 불러와야합니다.
>여기서 중요!!! : 그럼 그 포스팅 숫자는 과연 어디서 얻어오나요? model에선 제목, 포스트내용, 시간 같은 것 밖에 없습니다. 혹은 다른 포스팅과 구별할 만한 요소를 설정하지 않았는데요????
>저희는 데이터베이스를 처리할 때 python manage.py makemigrations 혹은 python manage.py migrate --run-syncdb 를 입력했습니다.
>그 때마다 migrations 폴더 안에 계속 변경사항이 00001, 00002와 같이 저장이 되었던 것이죠. 이게 지금 뭐가중요한데요? 라고 하시면
00001파일에 우리가 models.py에서 만들었던 요소들과 그 외에도 id라는 primary key 즉 구별되는 키가 우리가 만들지 않아도 생성되어 존재한다는 것을 알 수 있습니다. 때문에 우리는 포스팅 정보를 id로 구별하여 id 맞는 정보들을 가져와 구독자님들에게 보여 줄 예정입니다.(specific.html 파일을 아래에 따라 만든 후 같이 알아보아요!!)
> 이 첫번째 게시물을 눌렀을 때 무슨 내용이 나올지를 표시해 줄 페이지가 필요합니다. 때문에 templates폴더에 specific.html이라는 파일을 만들어 줄겁니다.
>그리고 git에서 specific.html을 복붙해줍니다. https://github.com/SahhaShin/django_blog/tree/master/blog_project/blog_app/templates/temp
>이제는 같은 패턴 익숙해지셨나요? templates 파일생성 -> urls.py 추가 -> views.py 추가 순 입니다.
>바로 urls.py에 path('<int:id>/',views.specific, name='specific'), 를 추가합니다.
>이젠 이해가 가시나요? 위에서 말했던 것 처럼 데이터베이스에 저장되어있는 id로 포스트(포스팅)를 구별해 줄 것이기 때문에 int형 id를 http://127.0.0.1:8000/index/1 이와 같이 표시해주기 위해서 <int:id>/라고 url을 표시해 준 것입니다.
>다음은 views.py를 처리해 주셔야겠죠? name을 specific이라고 해주셨으니 views.py에도 specific이라는 class를 만들어보도록 하겠습니다.
>여러분 git에서 복붙해오셨다면 여기도 temp를 지워주셔야합니다 ㅠㅠㅠ
from django.shortcuts import render,redirect,get_object_or_404
from .models import Post
from django.utils import timezone
#작성된 글 세부내용 표시(글의 아이디를 찾아 특정 글의 세부내용을 본다.)
def specific(request,id):
content=get_object_or_404(Post,pk=id)
return render(request,'specific.html',{'check':content})
>여러분 여기서 키 포인트는 노란색 선으로표시된 명령어를 이용하는 방법입니다. 즉, 헤더에 get_object_or_404를 추가해주셔야합니다.
>코드를 보면 request 옆에 id가 추가된 모습을 볼 수 있습니다. 즉, specific 행동이 요청이되면 id를 함께 입력인자로 가져오는 것을 확인할 수 있습니다. 예를 들어 내 구독자가 내블로그 포스팅 중에 1번 포스팅을 눌렀다면 id 1이 같이 넘어온다는 소리죠.
>즉, 1이 넘어오면 get_object_or_404라는 명령어를 입력하여 id가 1인 Post 객체 정보를 모두 가져오거나 (memo등) 1번 포스트 내용이 없으면 404 에러를 띄워라 라는 뜻입니다.
>그리고 404에러나 해당 포스팅의 Post정보를 가지고 있는 contents를 specific.html에 check라는 변수로 보낼 것이다! 라는 뜻입니다.
<div class="mt-5">
<u style="margin-left: 10%;"><small>{{check.selectType}}</small></u>
</div>
<table>
<tr>
<div class="table_wich" style="font-weight: bold; margin-top: 1%; font-size: 30px;">{{check.subject}}</div>
</tr>
<tr>
<div class="table_wich" style="font-weight: bold; margin-top: 1%;">
<small>{{check.created_date}}</small>
<blan class="blan"><small><a href="/delete/{{check.id}}">삭제</a></small></blan>
<blan class="blan"><small><a href="/update/{{check.id}}">수정</a></small></blan>
</div>
</tr>
<hr style="margin-left: 10%;margin-right: 10%;"><br>
<tr>
<div class="table_wich" style="margin-bottom: 3%;">{{check.memo}}</div>
</tr>
</table>
>그리고 다시 specific으로 돌아와 코드를 살펴보도록 하겠습니다.
>{{ }}안에 {check.{selectType}}, {{check.subject}}등을 써서 정보를 나타내는 모습이 보이시죠?
>views.py 에 specific class에서 특정 정보를 check에 넘겨주었기에 for문이나 if문의 검사없이 바로 쓰실 수 있다는 점!
2-5. CREATE와 READ가 어떻게 작동되는지 시험해봅시다!
> 그 전에!! 계속 제 포스트를 보고 따라오신 분이면 저번 포스트에서 create 동작을 시험하기 위해 create를 하고나서 저장과정을 거치고 다시 create화면으로 돌아오게 했습니다. 하지만 이제는 index 즉 메인뷰가 있기 때문에
>다음과 같이 index로 변경해줍니다.
>그리고 시험을 시작합니다.
>일단, 모든 요소를 저장해주시고 python manage.py runserver로 연결해줍니다.
>다음 http://127.0.0.1:8000/index/ 인 메인페이지로 이동합니다.
>다음 specific.html에서 create 페이지와 연결되어 있는 게시글 작성 버튼을 클릭합니다.
>CREATE를 시도합니다. 카테고리를 Django로 하고 제목과 포스트 글을 써주고 완료를 눌러보도록 하겠습니다.
>메인 페이지에 제가 쓴 글이 바로 올라가는 모습을 볼 수 있습니다.
>만약 메인이 안보이고 error가 난다 하시는 분은 위에서 말씀드린 views.py에서 temp를 안지워서 경로 에러가 난 것일 것입니다.
>이제는 제가 쓴 글을 눌러 자세한 내용들을 살펴보도록 하겠습니다.
<!--글 불러오기-->
<table>
{% for turn in check.all %}
<hr style="margin-left: 10%;margin-right: 10%;">
<tr>
<div class="table_wich" style="font-weight: bold; margin-top: 3%;"><a href="/{{turn.id}}">{{turn.subject}}</a></div>
</tr>
<tr>
<div class="table_wich" style="margin-bottom: 3%;"><a href="/{{turn.id}}">{{turn.memo}}</a></div>
</tr>
{% endfor %}
</table>
>위에서 설명은 안드렸지만 turn.subject , turn.memo 부분에 href로 /{{turn.id}}로 연결해둔 것을 볼 수 있죠 ^^ 해당아이디 포스트로 이동한다는 소리입니다!
>보시면 id, selType(카테고리), 제목, 작성시간, 내용이 잘 뜨는 것을 확인할 수 있습니다.
>왜 url에 id가 저는 3이냐면 그 동안 2개의 글을 시험하느라 쓰고 지웠거든요 ㅠㅠ 주의하셔야 할 게 1번 id로 지정된 글을 쓰고 삭제하면 다시는 id 1번을 쓸 수 없다는 점입니다. ㅎㅎ
>윗 글에 삭제와 수정버튼은 뭐에요?... 다음 포스트에서 설명할 CRUD 중 U와 D 라고 합니다 ^^
오늘 증말증말증말 길고 어려웠던 여정을 함께해주셔서 감사합니다. ㅠㅠㅠ
제가 설명하듯이 블로그 글을쓰며 다시 저를 이해시켜야 공부가 잘 되더군요
혹시 저만 공부하고 이해안되시는 부분있으면 댓글로 남겨주세용 ㅎㅎ
오늘도 고생하셨습니다 우리모두 화이팅해용!!
'대외활동 > 멋쟁이사자처럼 8기 (WEB)' 카테고리의 다른 글
[멋쟁이사자처럼8기 14~15주차] 블로그만들기 MVT, MTV전체 활용한 DELETE구현 : Django, MVT, CRUD (0) | 2021.11.04 |
---|---|
[멋쟁이사자처럼8기 14~15주차] 블로그만들기 MVT, MTV전체 활용한 UPDATE구현 : Django, MVT, CRUD (0) | 2021.11.04 |
[멋쟁이사자처럼8기 14~15주차] 블로그만들기 MODEL, VIEWS편 , CREATE구현 : Django, MVT, CRUD (0) | 2021.11.03 |
[멋쟁이사자처럼8기 14~15주차] 블로그만들기 TEMPLATES편 : Django, MVT, CRUD (0) | 2021.11.03 |
[멋쟁이사자처럼8기 9주차] Django 셋팅 1-2 (0) | 2021.11.03 |