본문 바로가기
django

2020.11.08_django_category 자동 넘겨주기

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

2020.11.08_django_category 자동 넘겨주기 정리노트

 

블로그 포스팅 간만간만! 이제는 제대로 배워서 블로그 포스팅 할 거 찾기 보다는 기존 것들도 내가 너무 제대로 안한 것들이 많아서 오늘은 그동안 썼던 CRUD 조차 지금 정말 많이 걸려서 다시 차근차근 보강, 응용하고 ++ 정리까지... 

 

세세히 한번 내가 정리 해보는 거라서 개연성은 제일 없음.. 다시 정리하고자 진짜 정리로 노트

 

 

주제는 우리가 예전에 commit=False 로 직접 카테고리를 정리했던 거에서 이번에는 아예 자동으로 create 하는 동시에 현재 있는 게시판의 카테고리를 자동으로 받아와서 게시판에 글 띄워주기!

 

 

 

이게 며칠이나 걸릴게 아니고 사실 id 값 하나 받아와주는 건데, 정말 며칠동안 왜... 못했을까... 반성하면서,

 

모델부터 다시 짜기!

 

 

기존 모델 - 내 깃허브

 

기존 create view - 내 깃허브

 

 

 

 

오늘은 내가 예전에 우당탕탕 짜놓고 정리가 너무 안되었던 코드랑 같이 비교하면서 정리하기..!

 

 

원래 >> 기존 Post 모델에 category field 를 추가해주고 view 에서 commit=False 로 저장을 지연시키고, 모델 필드에 직접 내가 데이터 넣어주기

 

문제점 >> 그렇게 되면, 게시판 당 CRUD 함수를 전부 구현해주어야하고, url 도 전부 따로 연결 시켜주어야 하며, 게시판을 나중에 추가해줄 수가 없음. 추가를 어찌 구현한다해도 그럴때마다 view, url 다시 작성 필요.

또한, Model 에 따로 카테고리 오브젝트를 저장하는 것이 아니기 때문에 데이터가 추가되면 될수록 카테고리만 따로 관리해줄 수가 없음.

 

 

또한 커뮤니티 서비스 특성상, 내가 카테고리가 많아지면 많아질수록 네브바안에 전부 담을 수 없을 것 같아 큰 카테고리 밑에 세부 미니 카테고리가 있어야 되겠다고 생각했다. 

 

 

 

그래서 기본 레이아웃부터 다시 작성하고, 일단 서치바는 기능 구현은 했으니, 제쳐두고 새로 카테고리와 미니 카테고리 데이터들을 담아줄 모델이 필요하다고 느꼈다.

 

그래서 구조는 카테고리 하위 항목 >> 미니 카테고리 >> 미니 카테고리 즉, 각 게시판의 글 ( Post ) 을 띄워줌.

 

이렇게 구성했다.

 

 

 

새로 짠 모델

 

 

그래서 앞으로 데이터들로 관리해주기 위해 그림 처럼 초록 배경에 있는 큰 카테고리는 카테고리 모델로 짜고,

미니 카테고리는 큰 카테고리의 하위 목록이기 때문에 제목과 함께, 다대일 관계인 포린키를 사용했다.

또한 한 미니 카테고리 ( 쉽게 말하면 한 게시판 ) 당 여러 게시글이 있으므로 Post의 category 필드 또한 포린키로 미니 카테고리를 참조했다. 또한 포린키를 사용하면 필수로 적어야하는 on_delete 속성에 CASCADE 를 주어 모델의 데이터가 삭제 되면, 참조 모델의 데이터 또한 같이 삭제 되도록 했다.

 

 

관계 정리는 이 게시물 ㄱㄱ

korinkorin.tistory.com/26

 

2020.09.15_django_관계 표현 modelfield

2020.09.15_django_관계 표현 modelfield_정리 노트 오늘은 저번 포스팅에서 잠시 언급했던 ManyToManyField 와 함께 관계를 정의하는 필드를 알아보고 활용...할 수 있도록 메모메모 공부공부 다대일관계 ( Ma

korinkorin.tistory.com

 

 

auto_now = True

 

DateTimeField 에서 게시글/댓글 등등.. 글을 새로 생성할 때마다 시간 갱신

 

auto_now_add = True

 

최조 생성 시간만 반영

 

 

또, 기존 auto_now 속성을 auto_now_add 로 바꿔서 글을 최초로 생성하는 시간만 업데이트 되도록 수정했다.

 

 

 

 

 

 

 

모델폼은 딱히 수정된 것이 없음없음.

category는 사용자에게 보여줄 필요가 없기 때문에 가져오지 않았다. 

 

 

새로운 create view

 

 

이렇게 써놓고 코드를 하나하나 정리하다보니 정말 놀랍게도.... (나만..)  댓글 함수와 매우매우 비슷함... 그냥 우리는 카테고리 모델과 미니 카테고리 모델을 생성해주었으니, 템플릿에서 띄워주기 위해 그 둘을 context 로 들고와주었을뿐....

역시 제대로 알지도 못하고 그냥 따라치거나 맨날 주석 달아도 이해를 한 척 그냥 친것이 분명해.....흑흑 정리하고 게시판에 띄워주기 까지 연결하면서 진짜 너무 헷갈려서 진짜 오래걸린듯.... 이렇게 보니 정말 지금까지 내가 해온 것과 다를 것이 없는 코드.

말그대로 미니카테고리 모델 즉, 게시판의 id 값을 저장하기전에 같이 가져와서 저장해준 다음에, redirect 로 넘겨줄 때 url 뒤에 id 값 붙여서 같이 들고와주면 되는 것이다... 직접 치니까 진짜 나는 그동안 하나도 이해하지 않았다고 많이 느꼈다.

 

 

주절주절 그만하고 이제는 그럼 게시판 목록 띄워줄 post_list 함수 ㄱㄱ

 

 

각각 미니카테고리의 게시물을 보여주는 post_list 함수

 

 

여기서... 바보 같이 많이 헷갈렸지만 정리하자면, 위와 같이 카테고리모델과 미니카테고리의 오브젝트들을 전부 가져와서 네브바에 띄워주기 위함이고,

 

나는 여기서도 미니카테고리의 아이디값을 하나 가져와서,  Post 모델에서 해당 아이디값인 것만 필터링 해서 들고 와주면 된다.

 

 

 

 

 

view 에서 아이디값을 써주었으니, url 상에서도 int 를 이용하여 같이 붙여주고, 

 

 

base.html

 

 

거의 모든 템플릿에 들어가는 네브는 저번에 했던 것처럼 base.html 에 다가 적어서 상속해주기.

 

카테고리는 딱히 링크 없이 하나하나 띄워줄거라 for문으로 돌려주고,

 

미니카테고리는 a 링크로 각 게시판의 게시물 post를 띄워줄거기 때문에 post_list를 실행해주고, 미니카테고리 아이디를 같이 가져와서 연결 시켜주기.

 

 

post_list.html

 

여기서는 마찬가지로 create 에 id 값을 같이 넘겨주고, title 부분과 게시판에는 이 게시판이 무엇인지 알려주기 위해 view 에서 context로 담아온 변수를 적어준다. 그러면 내가 등록한 미니카테고리의 이름이 잘뜬다! 

 

 

게시물은 for문으로 돌려서 하나하나 적어주고 html 태그를 방지하는 필터세이프, img 에는 저번에 배운대로 title 과 alt 를 써주었다!

 

 

그러면 나머지는 예전 내가 했던거랑 동일하니 실행 해봅씨다

 

 

 

각 미니카테고리 즉, 게시판을 들어가면 각 게시판 이름과 함께 잘뜨고 ( css 는 눈감아.. 다시 해야지..헣헣 )

 

 

 

 

 

 

글쓰기 페이지에도 이름이 들어가야할거 같아서 view 에서 이렇게 context로 담아주고, 실행시키니 마찬가지로 잘뜸..!

 

이제 테스트용으로 실행시켰는데,

 

 

헣헣 맞다 젠장

 

 

 

 

아까수정하면서 지웠나봄 ㅎㅁㅎ... 템플릿 상에서 이미지가 있는지 없는지, 처리를 해주어야한다!

그래서 if 를 써서 이미지가 있으면, 해당 url로 처리를 해준다.

 

++myimage로 필드이름을 써주어야함! 

 

 

 

 

짝짝 create도 실행이 잘되고,

 

 

 

 

post_list 함수로 인해서 각각 오브젝트들도 다 잘뜨게 됨 짝짝!!!

 

 

 

마지막으로 위에는 다 실행한 뒤에 지금 저렇게 카테고리가 잘 정렬 되어 있지만, 위에 캡쳐본을 보면

 

 

 

 

base.html 에서 띄워줄때 

 

 

 

이렇게 오브젝트들을 all로 들고와서,

 

base.html

 

 

카테고리와 미니 카테고리를 for문으로 하나하나 돌려서 하나씩 보여주고 있기 때문에, 지금 큰 카테고리안에 들어가는 각 미니카테고리를 정렬하지 못하고 있다......그래서 이것저것 찾아보고 결국 사용한 방법..!! 

 

 

 

models.py

 

index view

 

base.html

 

 

모델에 미니카테고리에서 카테고리를 포린키로 참조한 필드를 related_name 으로 필드 직접 이름을 정해준다.

 

먼저 index 뷰에 들고 올 것은 카테고리 오브젝트만 들고 오면 된다!

 

그리고 카테고리 오브젝트를 for문을 돌려 하나하나 분리해준 뒤,

 

하나의 카테고리 오브젝트 당, 미니카테고리가 포린키로 참조한 오브젝트를 역참조로 들고 온다.

 

우리는 미니카테고리에서 카테고리를 포린키로 가져와서 참조하는 것은 정참조, 일반적인 참조 방법이고,

 

참조되는 즉, 여기서는 카테고리 모델에서 미니 카테고리의 오브젝트들을 참조해서 가져오는 것을 역참조라고 한다.

 

형태는,

 

 

현재 테이블.참조하는 모델 컬럼_set.조건()

 

이렇게 쓰게 되는데,

위에 base.html 에서처럼

category.mini_category_set.all() 이렇게 쓰면 된다! 여기서 _set을 쓰지 않은 이유는, 내가 related_name 으로 필드 이름을 직접 정의하였기 때문에, 쓰지 않았다!

 

내가 특정한 조건을 걸어주고 싶을 때는 all 대신 filter 를 쓰거나, get을 써서 컬럼을 지정해서 리턴받을 수 있다.

filter(), all() 은 쿼리셋으로 리턴하기 때문에 인덱싱을 먼저 한 뒤 객체 내용을 리턴 받을 수 있다.

filter(조건)[인덱싱 숫자] 이런식으로!

 

get() 은 오브젝트 자체를 리턴한다.

 

values() 의 경우 딕셔너리를 반환 한다.

 

 

이렇게 해주면,

 

 

 

 

for문을 돌면서 미니카테고리가 각 카테고리로 그룹화가 될 것이고, 클래스를 지정해줘서

 

 

 

 

각 카테고리 마다 그룹화를 시켜줄 수가 있게 되었다!

 

나머지는 css 로 뚝딱뚝딱 만져보겠음..ㅎㅁㅎ... 

 


 

후 드디어 길고 긴.. 정말 앞으로 갈 길이 멀다... 오늘의 포스팅 끝!

댓글