본문 바로가기
django

2020.09.17_django_댓글 구현

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

2020.09.17_django_댓글 구현_정리노트

 

오늘은 그저께 정리했던 Foreign Key 를 써서 드디어 댓글 구현을 해보게씀!!!!! 짝짝 그러면 먼저 댓글 모델부터 작성하러 ㄱㄱ

 

models.py

 

 

 

Comment 모델 작성

ForeignKey를 참조할 모델은 위의 Post 모델이며, 게시물이 삭제되면, 그 게시물을 참조한 댓글들을 전부 지우는 on_delete=CASCADE 옵션을 넣어주었다. 

 

지금 둘의 관계는 1:N의 관계이다.

또한 외래키(FK) 는 참조하는 Post 모델의 테이블인 기본키 (PK) 와 항상 연결 되므로, id를 지정하여 연결할 필요 없이 그냥 Post 로 모델을 참조해주면 된다!

 

마지막으로 __str__ 함수는 self 라는 인자를 받아와서 해당 모델 클래스의 객체를 문자열로 리턴해줘서 정확히 명시해주는 거라고 할 수 있따.

 

 

뭔말인지 잘모르겠다면, 저번 포스팅 한번 스윽 읽기!

 

 

korinkorin.tistory.com/26

 

2020.09.15_django_관계 표현 modelfield

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

korinkorin.tistory.com

 

 

모델을 수정해주었으니 기억하자 

 

python manage.py makemigrations

 

python manage.py migrate

 

ㄱㄱ

 

 

 

 

이제 forms.py 로 가서 댓글폼을 만들어주러 갑씨다

 

 

 

 

 

 

이렇게 class meta를 써주고 우리가 상속받아올 모델이 Comment라고 알려주자. 그리고 나는 필드에 내용만 받아올거라근데 우연히 오류 발견!

 

 

 

이 오류의 뜻은 fields'속성이나 'exclude'속성없이 ModelForm을 만드는 것은 금지된다. 새로 고쳐라 라는 뜻임

 

오 그냥  field라고 써줬군...^^ ㅎㅁㅎ 덕분에  fields가 모델폼의 필수성분임을 되새기고... 껄껄 뒤에 s를 붙여서 오타 수정해주고

 

 

위에 모델 Comment도 Import 해주어따

 

 

 

 

또또 오륰ㅋㅋㅋ 후 

 

django.core.exceptions.FieldError : 'created_at'는 편집 할 수 없는 필드이므로 Comment 모델 양식에 지정할 수 없습니다 라는 뜻임.

ㅇㅎ DateTimeField 를 내가 auto_now=True로 자동생성해서 그런가봄. 껄껄 그럼 템플릿상에서 띄워줄 수 있을 것임 이것도 지우고 지금은 body만 띄워주자

 

 

 

 

 

최종최종 껄껄 이렇게 간단하게 그럼 바디만 모델폼에서 입력받게 해주고 이제는 detail 페이지에서 댓글을 달 수 있게 해야되니까 view에서 함수 작성 ㄱㄱ

 

 

 

 

 

기존 id 값의 게시물을 불러온 기능에 + 댓글폼도 같이 context에 담아서 띄워줍씨다. 물론 댓글 모델, 댓글 모델폼도 위에서 import 해주기!

 

 

 

 

이제 템플릿으로 가서 모델폼을 띄워주러 ㄱㄱㄱㄱㄱ

 

 

 

 

detail.html

 

 

위에는 뷰에서 받아온 my_post로 제목 내용 띄워준거구,

밑에서 이렇게 댓글폼은 폼태그에 넣어서 요청을 POST로 받아와주고, 보안토큰 이제 쓰는건 익숙쓰

쨋든 이렇게 띄워주게 되면,

 

 

 

 

 

이렇게 댓글폼이 잘뜨게 된다! 근데 이제 우리 댓글을 쓰고 저장하고 다시 그 결과를 템플릿에 띄워줘야하잖? 

 

그래서 댓글을 저장하는 함수를 만들기 위해 다시 뷰로 간다!

 

 

 

쟌쟈라쟌쟌..어렵군 주석처럼 POST 요청으로 받아주고 유효성검사 성공시에는 if문, 실패하면 redirect detail! 

 

또한 우리가 적어주는 글의 id를 다시 comment에서 정확히 명시해주기 위해 commit=False로 저장 지연시키고, 

 

아이디값이 맞으면 저장! category 가 뭔말인지 모르면 이 포스팅에서 한번 보기

 

**code  error 수정 **

temp_from = filled_form(commit=False) 

>>temp_from = filled_form.save(commit=False) 

 

이제 함수를 저장해주었으니... 그럼 다음은 ?

 

함수를 연결시켜줄 url로 간다!

 

 

 

이렇게 연결을 해주었고 이제 템플릿으로 가서 이 요청에 관한 것들을 띄워주자!

 

 

detail.html

 

 

여기서 action에 아까 우리가 아무것도 안적어줬는데, 우리가 action을 비우게 되면, 기존 함수를 실행 시키기 때문에, 우리는 댓글을 작성하는 create_comment 라는 함수를 뷰에서 들고온my_post의 id 값과 함께 불러와준다.

 

 

 

이제 밑에도 적어주자 ㄱㄱ

 

 

my_post in views.py

 

 

comment_set은 우리가 기본 값으로,  FK의 값을 참조해서 게시물에서 게시물 각각의 id 값을 가진 것들, 즉 한 게시물 id를 가진 댓글들을 불러와준다. 그래서 그 댓글들을 all로 전부 가져와주고

 

 

만약 comment_set이라는 기본 값을 바꾸고 싶다면,

 

 

 

 

이렇게 모델필드에서 related_name으로 옵션을 주면 comment_set을 안쓰고 comments라 쓸 수가 있음!

 

 

 

또한 아까 시간도 가져오고 싶다했으니 created_at을 템플릿상에 같이 띄워주었다.

 

 

자 이제 실행해볼까나

 

 

 

 

 

 

이렇게 제출을 해주고, 버튼 눌러봅씨다

 

 

 

험.... 근데 시간이 맘에 안든다. 우리나라 시간으로 바꿔야겠다.

 

어디서 바꾸느냐 바로 settings.py 로 ㄱㄱ

 

 

 

settings.py 

 

 

보통 이렇게 TIME_ZONE 에 들어가서 이렇게 바꿔주면 되던데, 오잉 적용이 안되는군

 

찾아보니

 

 

 

여기서 지금 USE_TZ 가 True라 그렇다네여

 

여기서 기본 값인 True는 templates, forms에서의 datetime에만 내가 설정한 TIME_ZONE이 적용이 된다고 함 

 

모델의 DateTimeField 에서는 적용이 안되고 default 값인 'UTC' 값으로 설정이 된 것.

 

그래서 이 부분을 False로 바꿔주면 모델에서도 TIME_ZONE 값이 적용 된다.

 

 

 

 

 

 

그래서 이렇게 해준 다음, 

 

 

 

 

이렇게 하면 그 뒤 작성된 댓글들은 정상적으로 한국 시간으로 된다. 잠시 근데 또 영어네 젠장 언어도 바꿔주자.

 

 

 

 

 

 

 

이렇게 언어는 ko-kr 옵션을 여기에다가 주면 

 

 

 

 

짝짝 드디어 내가 원하는대로 나옴 짝짝짝짝 

 


 

오늘은 댓글 구현을 이렇게 해보아씀미다 후 밤새고 아침에 코딩하는 건 정말 새롭다 껄껄

 

오늘의 아침 포스팅 끝끝!

댓글