Scala0114 2021. 10. 4. 16:20

1. author 속성 추가

 지난 글에서 회원 가입 기능을 추가했지만 아직까지는 회원 가입 후 로그인을 한 채로 게시글이나 답글을 작성하여도 
로그인 하지 않은 상태일 때와 달라진 것이 없다.  먼저 게시판의 질문, 답변에 글을 작성한 사람이 누구인지 보여주는

"글쓴이" 항목이 필요하다.

 

pybo/models.py 를 위와 같이 수정하여 Question 과 Answer 모델에 author 속성을 추가해준다. 

 

python manage.py makemigrations
python manage.py migrate

모델이 변경되었으니 이를 반영시키기 위해 위와 같이 makemigrations 와 migrate 명령을 수행해줘야 한다.

 

그런데 makemigrations 를 수행하면 위와 같은 메시지가 나온다.  기존에 User 정보 없이 작성된 게시글과 답글들을

어떻게 처리할지 묻는 것이다.  1을 선택하면 디폴트 값을 지정하거나 해당 값을 null로 처리할 수 있으며 2를 선택하면

작업을 취소한다.  디폴트값을 지정하기 위해 1을 선택해보자.

 

위에서 1을 선택하면 파이썬 셸에 진입한다. 여기서 디폴트 값을 1로 설정하기 위해 1을 입력하자. 1을 디폴트 값으로

지정하는 이유는 우리가 처음 만든 계정인 관리자 계정의 id가 1이기 때문이다.  계정은 생성될 때 마다 1부터 id가

순차적으로 증가하며 자동으로 생성된다.  이 작업으로 지금까지 회원가입 없이 작성한 모든 게시글과 답글은 관리자

계정으로 작성한 것이 된다.

 

위의 작업을 두 번(answer, question) 해주면 위와 같은 메시지가 뜨면서 makemigrations 명령이 수행된다.

 

마지막으로 migrate 명령어를 수행하면 정상적으로 완료되는 것을 볼 수 있다.

 

 

※  author 속성에 null 허용하기

 경우에 따라서는 User 정보 없이도 글을 작성할 수 있도록 할 수도 있다.  이것을 허용하려면 author 를 정의할 때

author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

와 같이 null=True 를 지정해주면 된다.

 

 

2. author 정보 저장

 이제 모델에 author 속성이 추가됐으니 질문, 답변을 저장할 때 author 정보도 함께 저장해야한다.

 

pybo/views.py 를 위와 같이 수정하여 게시글과 답글 저장시에 유저 정보가 추가되도록 한다.

 

 

3. 로그인이 필요한 함수

게시글과 답글 등록 시에 author 정보를 저장하도록 수정한 후에 로그아웃 상태로 게시글이나 답글을 작성하려하면 

위와 같이 ValueError 가 발생한다.  로그아웃 상태여서 request.user 가 User가 아닌 AnonymousUser이기 때문이다.

request.user 를 사용하는 함수를 모두 로그인이 필요한 함수로 지정하면 해당 함수를 호출 시 자동으로 로그인 화면

으로 이동하도록 할 수 있다.

 

pybo/views.py 를 위와 같이 수정하여 answer_create 와 question_create 를 로그아웃 상태로 실행 시 자동으로

로그인 화면으로 이동하도록 한다.

 

이제 로그인 없이 로그인이 필요한 함수를 호출하면 자동으로 로그인 화면으로 이동하는 것을 확인할 수 있다.

이 때 url 에 보이는 ?next= ... 는 로그인이 수행되면 다시 이동할 페이지를 의미한다.  그러나 현재 상태로는 로그인이 완료되고도 그 페이지로 이동되지 않는다.  로그인 템플릿을 수정하여 이 기능을 추가해야한다.

 

templates/common/login.html 을 위와 같이 수정하여 로그인 성공 후 next에 해당하는 url로 이동하도록 한다.

여기까지 완료하면 로그인이 필요한 기능을 로그인 없이 사용하려하면 바로 로그인 화면으로 이동하고 로그인이

완료되면 해당 페이지로 다시 돌아가는 것을 확인할 수 있다.

 

 

4.  disabled

 게시글 작성의 경우 작성 화면에 진입하기 위해 로그인이 필요하기 때문에 그럴일이 없지만 답글 작성의 경우 

로그인하지 않아도 게시글 상세 페이지를 볼 수는 있기 때문에 답글창에 답글을 작성해놓고 로그인을 하지 않아서

기껏 작성한 글이 날아가버리는 불상사가 발생할 수 있다.  이를 막기 위해 로그인 상태가 아니면 애초에 답글을

작성할 수 없도록 해보자.

 

templates/pybo/question_detail.html 을 위와 같이 수정하여 로그인 상태가 아니면 답글 작성 칸이 비활성화 상태가

되도록 한다.

 

이제 로그인 상태에서만 답글 창이 활성화 되는 것을 확인할 수 있다.