본문 바로가기
django

2020.09.08_django_category 나누기

by 해맑은 코린이 2020. 9. 9.

2020.09.08_django_category 나누기_정리노트

 

오늘은 카테고리별로 이름을 붙여줘서 view 함수에서 카테고리 별로 저장해주고, 띄우는 과정 포스팅!

 

 

먼저 models.py 로 들어가서 category 필드를 추가해주자.

 

 

카테고리 필드를 CharField 로 적어서 카테고리를 적어 줄 수 있는 필드 하나를 생성.

 

 

그러고 모델을 수정해주고 makemigrations 를 하게 되면, 

 

 

 

 

 

이런 오류 메세지가 뜨게 된다. 이 말은, 우리가 모델에서  필드를 수정해줄 때 자주 뜨게 되는데, 기존 마이그레이션으로 만들어진 데이터 테이블에 새로운 필드가 생기면서, 빈 공간들이 생겨서 그 빈 것들을 어떻게 해줄 건지 물어보는 것이다. 

 

크게 두 가지 방법이 있는데, 

 

__init__ 파일을 제외한 마이그레이션 파일과 pycache 파일을 모두 지우고 새로 migrations 를 해주는 것이다. 

 

-- 근데 이 방법으로 하면 아무래도 파일을 지우는 것이니 복구가 어려워서 나는 하다 망했다..ㅎ init 까지 지워버렸거든... 그렇게 되면 패키지로 인식하지 못해서 마이그레이션 적용 자체가 되지 않는다.

 

 

아니면 새로 만든 필드에 null=True or Blank=True, default 값을 추가해준다. 

 

이 방법은 빈 값들을 허용해주거나, 아예 디폴트 값을 주는 코드로 이 방법이 나중에 수정도 자유롭고 해서 나는 default 값을 빈 값으로 주었다.  또 CharField 는 문자열 기반 필드로 저번 포스팅에서 다뤘던 것처럼 null 값이 아닌 blank 라고 주면 된다.

 

 

 

이렇게 모델을 만들어 주었으면, 우리는 이 카테고리를 어떻게 적용 시킬 것인지 생각을 해보아야 한다.

 

내가 적용한 방법은 각각 create 함수와 url을 게시판 별로 다르게 줘서 기능 함수를 담당하는 view 에서 카테고리 이름을 지어주고, 이름별로 묶인 데이터들을 각 게시판에 띄워줘보자라고 도움...을 구해서 적용을 해보았다.

 

 

일단 모델폼 설명 .

 

 

우리가 카테고리에 이름만 남몰래...? 지어주면 되는거지 사용자들에게는 카테고리를 굳이 보여줄 필요가 없다. 그래서 모델폼에는 category 필드를 받아오지 않는다. 그냥 데이터 필드 값만 모델 상에서 존재하는 것.

 

 

 

모델을 admin.py 에 등록해주고, ( 저번 CRUD 2 포스팅에서 설명한 것 처럼 )

 

 

 

 

어드민 페이지로 들어가보면,

 

 

 

우리가 폼상에서는 가져오지 않았지만, 카테고리 필드에 잘 들어가있는게 보임미다

 

 

그 다음 view로 가서 이름을 지어줄 기능 함수를 작성해봅시다요.

 

 

 

먼저 우리가 각 게시판마다 view 와 url을 분리해준다고 했으니까, 나는 free 게시판에 적어줄 create를 free_create라고 이름을 지어 주었다. 그러고 데이터유효성 검사 코드를 쓰는 데, 중간에 잠시 commit=False를 통해 잠시 멈춰 준다. 

 

 

commit=False

이 옵션을 하게 되면, 데이터 베이스에 당장 저장하지 않고, 저장 하기 전에 특정 행위를 할 수 있다.

 

 

그래서 우리는 다시 필드폼을 저장하기전에 멈춘 것을 템프폼에다가 담아 주고, 카테고리 이름을 자유 게시판이라고 지어 주었다. 그러고 최종으로 저장해주고 해당 url 템플릿으로 redirect 해주기 !

 

 

 

context 는 또 무엇이냐

 

우리가 저번에 불러와줄 데이터들을 뷰에서 처리해줄 때 딕셔너리 형태로 불러와 주었는데, 딕셔너리 데이터가 많아지게 되면, 장고에서는 return에서 3개의 인자들을 불러와 주어야 하는데, 여러 개를 불러오게 되면 혼돈이 생긴다. 그 때 장고에서는 context를 사용해 딕셔너리 값을 불러와줄 수 있다. 

 

쓰는 방법은 맨 위에 context = dict() 딕셔너리 값이라고 정의해주고,

 

 context[ 'Key 값' ] = Value 값 이렇게 형태로 적어주고, 

 

return 할 때 context 만 적어주면 된다.

 

 

자자 그러며는 다음에 url을 각각 연결 시켜줘야하니 url 로 가서

 

 

 

 

요롷게 그냥 뷰에서 쓴 이름대로 url을 연결해줍씨다.

 

 

 

 

 

그러면 이렇게 url 연결이 될 거고, 우리는 이제 템플릿 상에서 띄워 주면 될 것이다!

 

 

create.html 로 ㄱㄱ

 

 

 

 

뭔가 바뀌었다.. 그냥 우리는 원래 폼을 p 형태로만 분리 해주었다면, 이번에는 하나씩 분리해서 적어주었다. 사실 이 태그와 

 

 

이 태그는 현재 똑같다. 하지만 위의 코드는 i.title 이나 부분적으로 띄워줄 때 유용하게 쓰인다.

 

 

근데 label 은 어디서 나왔지? i.title 을 적어줄 때 이거는 그냥 우리 필드 이름일까? 

 

 

 

 

 

 

 

정확한 대답은 여기에 있다. 개발자 도구로 들어가서 우리 필드들을 찍어보게 되면, label 로 감싸져있고, 그 안에 이름이 title이라 우리는 이 태그들을 들고와 준 것이다. 

예를 들어 모델폼에서 카테고리까지 들고와 줬다면, 따로 이 태그들을 가져와서

input type = "hidden" , name = " 자유 게시판 " 이렇게 html 상에서 똑같이 만들어줄 수 있다. 

 

hidden 을 사용해서 숨겨주고, 이름을 우리가 지금 있는 카테고리 이름인, 자유 게시판으로 이렇게 html 상에서도 적어줄 수가 있다. 쨋든 이 방법은 또 다른 방법 중 하나!

 

우리는 오늘 commit = False 라는 방법을 통해서 적어주었기 때문에 다른 방법은 참고참고.

 

마지막으로 띄워줄 때 이름이 자유 게시판인 것만 html 상에서 띄워주게씀!!!

 

view.py 로 ㄱㄱ

 

 

뭐가 바뀌었죠오오 바로 우리가 원래는 모든 오브젝트들을 들고 와주는 Post.object.all() 을 들고와 주었다면, 이제는 자유 게시판인 것만 들고 와야겠쥬 그래서 우리는 filter 와 contains 를 써주었슴메 여기서 모델 select 개념정리

 

get

은 당일행을 가져올 때 쓰는 select 로 하나의 method 만 쓸 수 있다. 보통 pk 값을 가져올 때 쓴다.

 

ex) model.object.get(pk = pk)

 

filter

Post.object.all().fillter() 와 똑같지만, all을 생략해서 써줄 수 있다. get 을 쓰지 않고 filter를 쓰는 이유는, 조건에 맞는 여러 행을 출력하기 위해서이다!

 

 

 

그래서 우리는 카테고리 이름 자유게시판을 포함하는 여러 행을 가져오기 위해 filter 와 contains을 써준 것이다. 지금은 한글이라 상관없지만  contains의 앞에 i 는 영어로 썼을 때 대소문자를 구분하지 않고 들고와주기 위해 써준 것! 메모메모 참고참고

 

 

자 이제 과정들은 끝끝

 

 


 

 

잘 되는지 점검하기 위해서 익명 게시판도 한번 해봅씨다.

 

 

 

views.py 작성 ( 변수명은 함수 안에서만 작동하므로, 똑같이 써주어도 상관 없음. )

 

 

 

 

url 까지 잘 해줍씨다.

 

 

직접 작성 ㄱㄱ

 

 

 

 

 

url 잘 넘어갔고 카테고리 없이 잘뜨고,

 

자유 게시판 글

 

 

 

익명 게시판 글

 

 

 

익명 게시판에서 써준 것만 여기 뜬다 짝짝 자유게시판에서는 이 글이 안뜸 !

 

 

 

 

 

마지막으로 최종적으로 admin 페이지에 들어가서 카테고리 필드를 보면 익명 게시판도 잘 뜬다!!!!!!

 

 


 

후 짝짝 오늘은 하는 방법 자체를 혼자 생각하지 못해서 구글링 조차도 제대로 하지 못했다 ㅠㅠ 기능들을 아는 것만이 코딩을 잘하는 게 아니란 것을 깨달았다... 어떻게 할 건지 잘 생각해서 구글링도 잘해야 겠다는 생각이 든 포스팅이었다 짝짝 오늘도 끝!

댓글