오늘은 드디어 전 편에서 만들었던 블로그 작성 TEMPLATES을 어떻게 작동시키는가?!
데이터베이스를 어떻게 저장시키는가?!
에 대하여 공부해보도록 하겠습니다!
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. 포스트 들어가기 전 알아야 할 키워드
Django는 3가지로 이루어져 있습니다. (쓰임새는 아래에서 같이 확인)
M:MODEL
V:VIEW
T:TEMPLATES
MVT를 잘 활용하여 다음과 같은 기능을 구현할 것 입니다.
C:CREATE
R:READ
U:UPDATE
D:DELETE
2. 블로그 글 작성하는 기능을 구현해봅시다.
먼저, 간단한 코드를 보고 오시죠!
모든 소스코드는 깃에서 확인해주세요.
https://github.com/SahhaShin/django_blog/tree/master/blog_project/blog_app/templates/temp
오늘의 핵심 코드는 바로 요기입니다. (모든 소스가 궁금하시면 위의 GIT에서 create.html을 보고 와주세요.)
<form action="" method="GET">
<select name="seltype" class="custom-select custom-select-lg mb-3 mid" >
<option value="Django" selected>Django</option>
<option value="Python">Python</option>
<option value="html/css">html/css</option>
<option value="Js/Jquery">Js/Jquery</option>
</select>
<input type="text" name="subject01" class="text_size" style="height: 50px;">
<br><br>
<hr style="margin-left: 10%;margin-right: 10%;">
<textarea name="memo01" class="text_size" style="height: 500px;"></textarea>
<br><br>
<div class="fixed-bottom bg-light" style="width: 100%; height: 10%;"><button type="submit" class="btn btn-dark" style="margin-left: 48%; margin-top: 1%; width: 80px;">완료</button></div>
</form>
이 코드가 아래와 같이 보여지게 됩니다.
2-1. 데이터베이스에 무슨 내용이 들어가야할까요?
어떤 카테고리인지(Django, Python, html/css, Js/Jquery) -> selectType으로 데이터베이스에 저장하자
제목 -> subject
내용 -> memo
글쓴시간 or 수정시간 -> create_date
라고 저장하겠습니다.
그럼 어떻게 저장할까요?
이 때 바로 MVT 중 Model을 쓰게 됩니다.
2-2. Model 작성
>다음의 빨간 색 경로에 있는 models.py에 들어옵니다.
class Post(models.Model):
subject=models.CharField(max_length=50, blank=False) #제목
created_date=models.DateTimeField(null=True, blank=True) #글쓴시간 / 수정시간
memo=models.CharField(max_length=200, blank=False) #내용
selectType=models.CharField(max_length=20, blank=False, default="Django") #카테고리
>그리고 다음과 같은 데이터베이스 틀을 만들어주세요.
>class 클래스명(model.Model): 을 기본 형태로 작성합니다.
>제목, 내용, 카테고리는 String과 같은 형식입니다. 따라서, models모듈을 활용하여 models.CharField를 사용합니다
>그밖에도 수정시간과 같은 시간형식은 models.DateTimeField, 정수형식은 models.IntegerField입니다.
>카테고리의 default값과 같이 기본값을 설정할 수도 있습니다. 물론 null값의 여부나 blank의 여부도 말이죠!
2-3. 데이터베이스를 명령어를 입력하여 만들어줍시다.
데이터베이스는 Models에 입력한다고 끝이 아닙니다! 명령어를 입력하여 완벽하게 생성해주어야합니다.
>runserver로 연결되어있다면 ctrl+c로 나와주셔야합니다.
>python manage.py makemigrations를 입력해줍니다.
>아래와 같이 create model 모델명이 나오면 정상적으로 데이터베이스가 만들어진 것입니다.
>데이터베이스를 만들고 python manage.py migrate를 입력해주어 데이터베이스 등록을 끝마칩니다.
>새로운 데이터베이스가 추가될 때마다 반복해주세요.
>다음과 같이 빨간색 경로에서 변경되는 사항을 확인할 수 있습니다.
2-4. 슈퍼유저를 만들어줍니다.
>슈퍼유저를 만들면 http://127.0.0.1:8000/admin/ 으로 자동연결이 가능하며 데이터베이스 저장 현황도 볼 수 있습니다.
>슈퍼유저와 일반 유저는 다릅니다!
>manage.py 모듈을 사용할 땐 꼭 manage.py의 위치에서 사용해주셔야합니다!
>python manage.py createsuperuser을 입력하여 슈퍼유저를 만들어줍니다.
>username은 임의로 admin이라고 하겠습니다.
>이메일도 임의로 제 이메일로 하겠습니다.
>Password도 임의로 admin이라고 하겠습니다.
>짧은 비밀번호 같은 경우 그래도 사용하겠냐는 문구가 뜨는데 경고에도 불구하고 사용할 거면 y 바꿀거면 n을 입력해주시면 됩니다.
>성공적으로 만들어졌다는 문구가 나오면 잘 만들어진 것입니다.
2-5. 슈퍼유저가 잘 만들어지고 데이터베이스가 잘 들어갔는지 확인해줍니다.
>python manage.py runserver로 서버를 연결합니다.
> http://127.0.0.1:8000/admin/ 으로 들어갑니다.
>성공적이라면 다음과 같은 창이 뜰 것입니다.
>슈퍼유저 만들 때 만들었던 아이디와 비밀번호로 들어가주세요!
>다음과 같은 페이지가 보이면 성공입니다.
>어? 그런데 내가만든 데이터베이스모델은 어디서 보이는 거죠? 안보이시는게 정상입니다.
>빨간색 경로로 들어와 다음과 같이 추가해주셔야 admin페이지에서 보입니다.
>models.py에서 만들어준 Post를 추가하려면 from .models import Post를 입력하여 불러옵니다.
>또 그 밑에 admin.site.register(Post)를 입력하여 admin사이트에 등록해줍니다.
>새로고침 혹은 runserver종료 후 다시 서버접속을 하시면 다음과 같이 Posts가 보이면 성공입니다.
>Posts를 한 번 눌러볼까요?
>Posts를 누르시면 위에 ADD POST로 내용을 데이터베이스에 추가할 수 있습니다.
>다음과 같이 우리가 models.py에 등록했던 요소들이 보이는 것을 알 수 있습니다 ^^!
2-6. create.html을 통해 데이터베이스에 내용을 저장해봅시다.
<form action="" method="GET">
<select name="seltype" class="custom-select custom-select-lg mb-3 mid" >
<option value="Django" selected>Django</option>
<option value="Python">Python</option>
<option value="html/css">html/css</option>
<option value="Js/Jquery">Js/Jquery</option>
</select>
<input type="text" name="subject01" class="text_size" style="height: 50px;">
<br><br>
<hr style="margin-left: 10%;margin-right: 10%;">
<textarea name="memo01" class="text_size" style="height: 500px;"></textarea>
<br><br>
<div class="fixed-bottom bg-light" style="width: 100%; height: 10%;"><button type="submit" class="btn btn-dark" style="margin-left: 48%; margin-top: 1%; width: 80px;">완료</button></div>
</form>
>create.html을 보시면 저는 git에서와는 달리 현재는 action="" 부분에 아무것도 해놓지않은 상태입니다.
>action="{%url 'storage'%}" 으로 수정하여 완료버튼을 누르면 저장 즉, storage 동작, 액션을 해봅시다.
>action="{%url 'storage'%}" 에 의미는 urls.py에 가서 storage 의 url을 찾아라. 라고 저를 이해시키고 있답니다 ㅠ ㅠ
>그럼 저희도 얼른 url에 가서 storage url을 추가시켜야겠죵?!
>다음 빨간색 경로로 이동 후 path('storage/', views.storage, name='storage'), 를 입력해줍니다.
>이 뜻은 storage url이 들어오면 views의 storage class로 이동하라는 뜻이라고 했죠? 그럼 저희도 views.py로 이동합니다.
>빨간색 경로로 이동하여 views.py로 옵니다.
>노란색 혹은 주황색으로 보이는 storage 코드를 작성합니다.
from django.shortcuts import render,redirect
from .models import Post
from django.utils import timezone
#게시글작성 후 저장 -> 글쓰기페이지
def storage(request):
post_save=Post()
post_save.selectType=request.GET.get('seltype','')
post_save.subject=request.GET['subject01']
post_save.memo=request.GET['memo01']
post_save.created_date=timezone.datetime.now()
post_save.save()
return redirect('../create')
>storage class 작성 전 중요한 점!!!
from django.shortcuts import render,redirect
from .models import Post
from django.utils import timezone
를 추가해주세요!! 그래야 아래와 같은 코드를 활용할 수 있습니다 ㅠ ㅠ
>post_save라고 post내용을 저장하는 하나의 객체를 설정했습니다.
>models.py에서 selectType은 카테고리 선택을 담당했었죠? post_save라는 객체의 selectType에 저장할 계획입니다.
>request.GET.get('seltype','') 이 부분은 create.html과 같이 보셔야합니다. 아래를 보시죠
<form action="{%url 'storage'%}" method="GET">
<select name="seltype" class="custom-select custom-select-lg mb-3 mid" >
<option value="Django" selected>Django</option>
<option value="Python">Python</option>
<option value="html/css">html/css</option>
<option value="Js/Jquery">Js/Jquery</option>
</select>
>보시면 select안에 name을 seltype이라고 한 게 보이시나요? (select 첫 줄)
>그래서 위의 코드를 작성할 때 request.GET.get('seltype','')를 얻어오겠다라고 적어왔던 것입니다.
>form을 보시면 GET방식으로 얻어온 것을 볼 수 있죠? 그래서 request.GET 즉, 겟방식으로 요청해서 얻어오겠다는 뜻입니다.
>다시 storage class를 보시죠.
#게시글작성 후 저장 -> 글쓰기페이지
def storage(request):
post_save=Post()
post_save.selectType=request.GET.get('seltype','')
post_save.subject=request.GET['subject01']
post_save.memo=request.GET['memo01']
post_save.created_date=timezone.datetime.now()
post_save.save()
return redirect('../create')
>제목이나 내용도 name에 적힌 부분을 얻어오겠다고 카테고리와 똑같은 방식으로 데이터를 얻어왔다는 것을 알 수 있습니다.
>시간과 같은 경우는 timezone.datetime.now()를 써 현재 시간을 불러온 것을 알 수 있습니다.
>중요한 점은 꼭 post_save.save()를 써 객체에 저장한 것을 꼭 저장해야한다는 점입니다. save 안써주면 저장이 안됩니다.
>그리고 또 중요한 점은 storage하고 어디로 이동할까를 return에서 정해주셔야합니다.
>현재는 create.html밖에 없으므로 create페이지로 다시 이동하도록 하겠습니다. return redirect('../create')
2-7. CREATE구현이 잘 되나 봅시다.
>http://127.0.0.1:8000/create/ 로 이동합니다.
>다음과 같이 카테고리, 제목, 내용을 입력하고 완료를 눌러보겠습니다.
>아까 redirect로 create로 다시 돌아오게 설정하고 다시 돌아온 모습이 보이시죠?
>어? 그럼 내용 저장되있다는 걸 어떻게 알아요 ㅡㅡ?
>현재는 CRUD 중 CREATE만 구현이 되어있어서 READ는 ADMIN에서 확인할 수 밖에 없습니다.
>확인해볼까요?
>다시 http://127.0.0.1:8000/admin/ 으로 들어와 Posts를 눌러줍니다.
>추가된게 보이시나용?!
>아주 잘 CREATE 된 게 보이시죠?! ㅎㅎ
오늘 내용은 어떠셨나요?
내용이 너무 많아서 읽기 싫으셨을텐데 항상 읽어주셔서 감사합니다 ㅠ ㅠ
더 열심히하는 멋쟁이사자처럼 8기 일원이 되도록 하겠습니다.
다음 포스트에서도 이어서 READ를 구현하며 MAIN페이지 제작까지 해보겠습니다
다음 포스트에서 만나용!!
'대외활동 > 멋쟁이사자처럼 8기 (WEB)' 카테고리의 다른 글
[멋쟁이사자처럼8기 14~15주차] 블로그만들기 MVT, MTV전체 활용한 UPDATE구현 : Django, MVT, CRUD (0) | 2021.11.04 |
---|---|
[멋쟁이사자처럼8기 14~15주차] 블로그만들기 MVT, MTV전체 활용한 READ구현 : Django, MVT, CRUD (0) | 2021.11.04 |
[멋쟁이사자처럼8기 14~15주차] 블로그만들기 TEMPLATES편 : Django, MVT, CRUD (0) | 2021.11.03 |
[멋쟁이사자처럼8기 9주차] Django 셋팅 1-2 (0) | 2021.11.03 |
[멋쟁이사자처럼8기 9주차] Django 셋팅 1-1 (0) | 2021.11.02 |