python migrations, 게시글작성자노출,수정,삭제 구현
2023.04.23 - [파이썬을 이용한 웹구축] - 파이썬 장고 로그인,회원가입구현하기
파이썬 장고 로그인,회원가입구현하기
admin 계정으로 로그인을 해보면 이렇게 accounts profile을 찾을 수 없다는 에러가 뜬다 config -settings.py로가서 맨 아래에 로그인 url을 추가해준다. config폴더에 url.py로가자 위 코드는 Django 앱의 URL 패
ji7290.tistory.com
로그인이 되어있는 상태에서 진행하도록하자
관리자페이지로 넘어가자
admin이 아닌 일반사용자로는 접근권한이 없다.
admin으로 로그인을 일단해보자
admin페이지에서 사용자들의 정보를수정할 수도 있고
어느그룹에 속해있는지, 접속시간은 언제인지 확인할 수 있다.
로그아웃후
다시 게시판으로 돌아가서
test1으로 로그인해준 뒤, 일반사용자 test1이 글작성을 할 수 있는지 확인해보자
게시글,댓글작성이 잘된다.
하지만 게시글과 댓글 을 누가 작성했는지 알 수있는 방법이 없다.
아직 이 글쓴이에대한 속성이 안잡혀있다.
아이디가 게시글목록에 나타나게만들어보자.
board에 models.py로가자
장고가 제공하는 내부기능인 contrib를 import시켜주고
변수 author를 선언해서 사용자가 삭제되면 사용자가 작성했던 글들을 지울 수 있게 만들어준다.
모델 바뀐게있기 때문에 서버를 끊고
마이그레이션 해줘야한다.
python manage.py makemigration 엔터
선택지를 두가지준다
1번 엔터
여기서 선택한 1이
이미작성된 게시글에 대해서 모든 게시글의 작성자를 1로 넣어준다.
0001 이름으로 ~한거다 라고 간단하게 알려주고있는 것이다
board -> migrations에 들어가서 0002번 author를 확인하면
마이그레이션이 생성되어있다.
마이그레이션후에는 무조건
python manage.py migrate로 를 입력해줘야한다.
answer쪽에도 author를 추가시켜준다.
author = models.ForeignKey(User, on_delete=models.cascade)
author변수를 models에 사용자로 지정해주고 사용자가 탈퇴하면 이전에 썻던 게시글을 전부삭제해준다
models.py를 수정해줬으니 또 마이그레이션을 해준다.
python manage.py makemigrations입력
1번
1번
python manage.py migrate
이제 board에 views.py로가서
answer,question에 author를 추가시켜준다
이제 서버를 열어준다.
글작성을 해보면 아직 나오는게없다
다만 누가 어느게시글에 어떤 게시글을 남겼는지 admin페이지에서는 확인이가능하다
로그아웃한 상태에서 글작성해보자
지금 게시글을 작성한 익명의 사용자가 user 인스턴스를 가지고있지않아서 에러가뜬다.
로그인을 한 상태에서만 게시글,댓글작성을 할 수 있게 만들어보자
board -views.py로가자
장고 내부기능인
contrib.auth.decorations 을 login_required에 import시켜주고
c_answer, question에
login_required를 어노테이션시켜준다
이 함수는 다음 두가지의 조건으로 로그인된 사용자만 이용할 수 있게 만드는것이다.
1.로그인이 필요하다 -> 로그인이 안되어있을때 login페이지로 이동시켜주겠다.
다시 로그아웃상태에서 글작성을 누르면
로그인 페이지로 넘어가게된다.
하지만 글작성을 누른뒤 보이는 로그인화면에는
8000/common/login/?next=/board/question/create/ 사이트주소가 다르다.
login.html에서
next라는 변수를 이용해서 next = (이자리에 할당시켜준다)
로그아웃 상태로 댓글 작성을 눌렀을때 작성권한을 없애준다.
textarea부분을 수정해서 조건문으로 유저가 익명이면 textarea를 막는다
로그아웃한상태로 게시글에 들어가서 댓글폼을 확인해보자 비활성화되어있다.
게시글 목록에 글쓴이가 안나온다.
q_list.html <table>영역에 작성자 필 <th>가 없기때문이다.
이제 댓글창에 작성자를 넣어보자
q_detail.html로 가자
게시글,댓글의 div영역에 question.author.username을 할당시켜서
댓글부분의 게시글, 댓글작성자를 노출시킨다.
회원가입,로그인, 게시글,댓글작성, 작성자 노출까지 구현시켜보았다.
이제 수정,삭제를 구현해보자
models.py로가자
질문, 답변 클래스에
modify_date변수를 선언해주고 null값 true, blank true 널값과 빈칸이 참을 허용할 수 있도록 할당시켜준다.
모델.py수정해줬으니 서버끊어주고 마이그레이션해주자
수정기능을 작동할 수있는 migrations가 생겼다.
q_detail.html로가서 수정할 수 있는 영역을 만들어준다.
m_question이 없기때문에 만들어준다.
board - urls.py로가서 path추가해준다
path에 question/modify/int형정수로 사이트경로를 할당해주고
views에 m_question을 사용해서 이름은 m_question으로 지정하겠다는 의미이다.
views.py에 m_question 함수를 생성한다
엉뚱한 사용자로 로그인을해놓고 주소창 맨끝에 번호를 바꿔서
다른 사용자의 게시글을 함부로 수정할 수 없게 만들어준다.
중요)
이 구문은 수정 페이지를 처리하는 함수
이는 이 함수에 접근하기 위해서는 로그인이 필요하며, 로그인하지 않은 경우 `common:login` URL로 리디렉션된다.
question_id 를 매개변수로 받아 해당하는 `Question` 객체를 `get_object_or_404()` 함수로 가져온다.
그 후에는 현재 로그인한 사용자가 해당 question 의 작성자인지 확인한다
만약 그렇지 않은 경우에는 `messages.error()` 함수로 에러 메시지를 생성하고
redirect()`함수로 상세 페이지로 이동
request.method`가 "POST"인 경우, `QuestionForm`을 인스턴스화하고 요청된 POST 데이터와 함께 제출
만약 유효한 데이터인 경우, 수정된 질문을 저장하고 상세 페이지로 리디렉션한다.
`request.method`가 "POST"가 아닌 경우, `QuestionForm`을 기존 `question` 객체의 인스턴스로 생성
마지막으로, `form`과 함께 `board/q_form.html` 템플릿을 렌더링하고, 결과를 `context` 변수에 저장하여 반환한다.
수정버튼을 누르면 수정이 잘된다.
test3로 로그인이되어있다
그러나 307번 게시글은 test1이 작성한 게시글이다
url을 307번으로 임의로 수정해서 게시글을 수정하려고하니
수정버튼이 사라져있다. 또는 경고메세지가뜬다. 다른사용자의 게시글을 함부로 수정할 수 없게 막아뒀다.
다음은 댓글 수정, 게시글 수정,삭제를 배워보자