게시글 수정 및 삭제 기능

Red_Panda·2021년 3월 30일
0

드디어 게시글을 수정하고 삭제하는 기능을 만든다.

modify_date=db.Column(db.DateTime(), nullable=True)

models.py 파일내에 있는 Question, Answer 클래스에 해당 코드를 추가했다. 수정일시를 저장한다.


그리고 cmd에서 데이터베이스를 변경해줬다.


현재 로그인한 사람이 글쓴이 일때, 수정 버튼을 보이도록 했다.

그런데, 나의 경우에는 비로그인 상태로도 게시판 글을 작성할 수 있기 때문에 위 코드처럼 하면 비로그인 상태일 때, 비로그인상태로 작성한 모든 게시물에서 수정 버튼이 보인다.
그래서 먼저 로그인 상태인지 파악 후, 로그인한 사람이 글쓴이 일때 수정 버튼을 보이도록 했다.

일단 로그인해서 작성한 사람만 글을 수정, 삭제할 수 있도록 만들고 비로그인으로 작성한 글에 대해서는 어떻게 할지 생각 해봐야겠다.

modify 라우트 함수를 만들기전, 로그인 상태가 필요한 함수를 만든다.

import functools

def login_required(view):
    @functools.wraps(view)
    def wrapped_view(**kwargs):
        if g.user is None:
            return redirect(url_for('auth.login'))
        return view(**kwargs)
    return wrapped_view

auth_views.py에 위 코드를 추가해줬다. 다른 함수에 @login_required 애너테이션을 지정하면 login_required 데코레이터 함수가 먼저 실행되어 g.user가 있는지 조사한다. 있으면 원래함수 실행, 없으면 로그인 URL로 리다이렉트한다.

from pybo.views.auth_views import login_required

question_views.py에 위 코드를 추가해 만들어준 애너테이션을 임포트하고 원하는 라우트 함수에 적용하면된다.

question_views.py에 flash를 임포트해주고, 위와 같이 질문 수정 라우트 함수를 작성하였다.

현재 질문 수정은 로그인이 필요하므로 @login_required 애너테이션을 이용했다.
질문 수정 버튼을 누르면 modify 함수가 GET방식으로 요청된다.
수정 버튼을 누르면, 해당 질문의 제목, 내용 등 데이터가 보여야 한다.

그래서 이를 위해 조회한 데이터를 obj 매개변수에 전달해 폼을 생성하는 QuestionForm(obj=question) 를 이용했다.

그리고, 저장하기 버튼은 POST 방식으로 요청된다.
POST방식요청일때 검증을하고, 검증이 되면 변경된 데이터를 저장한다. form.populate_obj(question)는 화면에 입력되어 있는 데이터를 question 객체에 적용해 준다.


다른 계정으로 접속할때 수정 버튼이 보이지 않는다.


이번에는 제목과 내용을 수정을 테스트 해봤다.잘 수정 됐다.

이제 질문 삭제 버튼 및 기능을 만들고 답변도 똑같이 적용해주면 된다.


수정 버튼 밑에 삭제 버튼을 넣었다. 삭제의 경우 jQuery를 사용해야한다.
class 속성으로 delete를 추가해 삭제 버튼을 눌렀을때 자바스크립트를 호출하도록 했다.

그리고 jQuery에서 $(this).data('uri')로 삭제를 실행하는 URL을 얻으려고 data-uri 속성도 추가했다.


jQuery는 jQuery 자바스크립트 파일을 불러온 다음에야 사용할 수 있다.

base.html 파일을 수정해 템플릿에서 jQuery를 사용할 수 있도록 한다.
base.html 파일을 상속받는 템플릿이 이 블록을 구현해 jQuery를 사용한 코드를 작성할 수 있다.


question_detail.html 파일 맨 밑에 삭제 알림 창 기능을 추가했다.
jQuery를 처음해본터라 jQuery를 좀 짚고 넘어가기로 했다.

<script type='text/javascript'> </script>  

브라우저가 다른 script 언어와 구분하여 java script를 인식하도록 한다.

$(document).ready(function()

document는 브라우저에서 제공하는 자바스크립트 내장객체다. 문서 객체모델의 최상위객체 라고한다. 문서 구조를 다 불러오고 나서 실행된다고 한다. 그래서 화면이 나타난 이후 자동으로 호출되는 jQuery함수다.

$(".delete").on('click', function() {
        if(confirm("정말로 삭제하시겠습니까?")) {
            location.href = $(this).data('uri');
        }

버튼을 누르면 delete 여부를 묻는 알림창이 뜨고, 확인을 누르면 해당 data-uri 속성값으로 URL 호출을 한다.

질문 삭제 라우트 함수를 question_views.py에 추가했다.




테스트 :[283] 게시글을 삭제했다. pybo.db 파일에서도 삭제된 것을 확인할 수 있다.

이제 답변 부분만 구현해주면 된다! 질문 수정 및 삭제와 비슷하다.


질문 수정과 마찬가지로 question_detail.html에 답변 수정버튼을 만들었다.

답변 수정 modify는 질문 수정 modify와 매우 비슷하다.

답변의 경우, 질문 작성글 처럼 따로 페이지를 작성하지 않았다. 그래서 답변 수정 폼 answer_form.html을 작성했다.




답변을 수정했을때의 시간도 db에 잘 저장됐다.

삭제 버튼을 수정버튼 옆에 추가했다. 구조는 질문글 삭제버튼과 같다.

생각해보니 아까 질문글삭제 함수만들때 g.user가 있는지 먼저 확인했는데, @login_required가 있어 굳이 그럴필요 없었다. 답변 삭제 함수도 질문 삭제 함수와 똑같다.


잘 삭제된다.



아까 저장해논 modify_date를 이용해서 수정 시점도 출력 했다.

출력 성공

profile
신입 개발자

0개의 댓글