#4 게시판 세부 기능 구현

saiy17·2021년 9월 7일
0

Face Out

목록 보기
4/6
post-thumbnail

1. 게시글 삭제 기능 구현

@app.route('/question_delete', methods=['GET','POST'])
def question_delete():
    id = request.args.get('id', '아이디')
    q_delete = db_session.query(QuestionContent).filter_by(id=id).first()
    if q_delete:
        db_session.delete(q_delete)
        db_session.commit()
        flash('글이 삭제되었습니다.')
        return redirect('/mypage')
    else:
        return render_template('/user_templates/main.html')

2. 게시글 수정 기능 구현

@app.route('/myquestion_edit', methods=['GET', 'POST'])
def myquestion_edit():
    title = request.args.get('title', '제목')
    category = request.args.get('category', '카테고리')
    content = request.args.get('content', '내용')
    id = request.args.get('id', '아이디')
    date = request.args.get('date', '날짜')
    edit_question = db_session.query(QuestionContent).filter_by(id=id).first()
    print(request.method)

    if request.method == 'POST':
        if edit_question:
            edit_question.create_date=datetime.now()

            if request.form['now_title'] != edit_question.title:
                edit_question.title = request.form['now_title']
            if request.form['now_content'] != edit_question.content:
                edit_question.content = request.form['now_content']
            db_session.add(edit_question)
            db_session.commit()

        return render_template('/user_templates/question.html',
                               title=edit_question.title, date=edit_question.create_date, category=category, content=edit_question.content)
    else:
        return render_template('/user_templates/myquestion_edit.html', title=title, category=category,
                           content=content, id=id, date=date)
👉 게시글 삭제와 수정은 자신의 글에서만 가능

3. 게시글 검색 기능 구현

@app.route('/question_search', methods=['GET','POST'])
def question_search():
    if request.method == 'POST':
        search = request.form['search']

        limit = 5   # 한 페이지당 최대 게시물
        page = int(request.args.get('page', type=int, default=1))   # 페이지 값

        # .all() 이 붙은 순간 list가 됨.
        question_list = []
        content_list = db_session.query(QuestionContent).filter(QuestionContent.is_secret == 0).all()
        for i in content_list:
            if search in i.content:
                question_list.append(i)

        tot_cnt = len(question_list)    # 게시물 총 개수

        # list를 각 페이지에 맞게 slice 시킴
        if page == 1:
            question_list = question_list[-((page - 1) * limit + limit):]
        else:
            question_list = question_list[-((page - 1) * limit + limit):-((page - 1) * limit)]

        last_page_num = math.ceil(tot_cnt / limit)  # 마지막 페이지 수, 반드시 올림 해야 함.

        block_size = 5  # 페이지 블럭 5개씩 표기
        block_num = int((page - 1) / block_size)    # 현재 블럭의 위치 (첫번째 블럭이라면, block_num=0)

        # 현재 블럭의 맨 처음 페이지 넘버 (첫번째 블럭이라면 block_start = 1, 두번째 블럭이라면 block_start = 6)
        block_start = (block_size * block_num) + 1
        # 현재 블럭의 맨 끝 페이지 넘버 (첫 번째 블럭이라면, block_end = 5)
        block_end = block_start + (block_size - 1)

        if session.get('u_id'):
            return render_template('/user_templates/q&a.html', question_list=question_list,
                               limit=limit, page=page, tot_cnt=tot_cnt,
                               block_size=block_size, block_num=block_num, block_start=block_start,
                               block_end=block_end, last_page_num=last_page_num, now_user=session['u_id'])
        else:
            return render_template('/user_templates/q&a.html', question_list=question_list,
                                   limit=limit, page=page, tot_cnt=tot_cnt,
                                   block_size=block_size, block_num=block_num, block_start=block_start,
                                   block_end=block_end, last_page_num=last_page_num)
    else:
        return render_template('/user_template/q&a.html')
👉 검색하고자 하는 text를 search로 입력받은 후, 게시글 db에서 비밀글이 아니면서 search가 포함된 content를 가진 행을 찾음

4. 카테고리 검색 기능 구현

@app.route('/category_search', methods=['GET','POST'])
def category_search():
    category = request.args.get('category', '카테고리')

    limit = 5   # 한 페이지당 최대 게시물
    page = int(request.args.get('page', type=int, default=1))   # 페이지 값

    question_list = db_session.query(QuestionContent).filter(QuestionContent.is_secret == 0, QuestionContent.category == category).all()
    tot_cnt = len(question_list)    # 게시물 총 개수

    # list를 각 페이지에 맞게 slice 시킴
    if page == 1:
        question_list = question_list[-((page - 1) * limit + limit):]
    else:
        question_list = question_list[-((page - 1) * limit + limit):-((page - 1) * limit)]

    last_page_num = math.ceil(tot_cnt / limit)  # 마지막 페이지 수, 반드시 올림 해야 함.

    block_size = 5  # 페이지 블럭 5개씩 표기
    block_num = int((page - 1) / block_size)    # 현재 블럭의 위치 (첫번째 블럭이라면, block_num=0)

    # 현재 블럭의 맨 처음 페이지 넘버 (첫번째 블럭이라면 block_start = 1, 두번째 블럭이라면 block_start = 6)
    block_start = (block_size * block_num) + 1
    # 현재 블럭의 맨 끝 페이지 넘버 (첫 번째 블럭이라면, block_end = 5)
    block_end = block_start + (block_size - 1)

    return render_template('/user_templates/q&a.html', question_list=question_list,
                               limit=limit, page=page, tot_cnt=tot_cnt,
                               block_size=block_size, block_num=block_num, block_start=block_start,
                               block_end=block_end, last_page_num=last_page_num,now_user=session['u_id'])
👉 카테고리별 게시글을 보여줌. 만약 '동영상 업로드' 카테고리를 누르면 카테고리가 '동영상 업로드'인 글만을 보여줌

5. 게시글 창 및 댓글 등록 기능 구현

@app.route('/question', methods=['GET', 'POST'])
def question():
    title = request.args.get('title', '제목')
    category = request.args.get('category', '카테고리')
    content = request.args.get('content', '내용')
    id = request.args.get('id', '아이디')
    date = request.args.get('date', '날짜')
    writer = request.args.get('writer', '글쓴이')

    comment_list = db_session.query(Comment).filter_by(question_id=id).all()

    if not session.get('u_id'):
        return render_template('/user_templates/question.html', title=title, date=date, category=category,
                               content=content, id=id,  writer=writer, comment_list=comment_list)
    else:
        # 댓글 추가
        if request.method == 'POST':
            comment_content = request.form['content']
            if len(comment_content) > 50:
                flash("댓글제한수를 넘겼습니다. 50자 이하로 다시 입력해주세요.")
                return render_template('/user_templates/question.html', title=title, date=date, category=category,
                                   content=content,
                                   id=id, now_user=session['u_id'], writer=writer, comment_list=comment_list)
            else:
                new_comment = Comment(comment_content=comment_content, commenter=session['u_id'], question_id=id)
                db_session.add(new_comment)
                db_session.commit()
                comment_list = db_session.query(Comment).filter_by(question_id=id).all()
                return render_template('/user_templates/question.html', title=title, date=date, category=category,
                           content=content, id=id, now_user=session['u_id'], writer=writer, comment_list=comment_list)
        else:
            return render_template('/user_templates/question.html', title=title, date=date, category=category, content=content,
                               id=id, now_user=session['u_id'], writer=writer, comment_list=comment_list)
👉 로그인 한 상태라면 댓글을 쓸 수 있고, 로그아웃 상태라면 댓글 등록 칸이 안보이게 만들어줌. 댓글은 50자 이하로 제한시켜 50자 이상이면 flash 창을 띄워줌

6. 댓글 삭제 기능 구현

@app.route('/comment_delete', methods=['GET','POST'])
def comment_delete():
    title = request.args.get('title', '제목')
    category = request.args.get('category', '카테고리')
    content = request.args.get('content', '내용')
    id = request.args.get('id', '아이디')
    date = request.args.get('date', '날짜')
    writer = request.args.get('writer', '글쓴이')

    c_delete = db_session.query(Comment).filter_by(id=id).first()
    if c_delete:
        db_session.delete(c_delete)
        db_session.commit()
        comment_list = db_session.query(Comment).all()
        return render_template('/user_templates/question.html', title=title, date=date, category=category,
                               content=content, id=id, now_user=session['u_id'], writer=writer,
                               comment_list=comment_list)
    else:
        return render_template('/user_templates/main.html')
👉 자신이 쓴 댓글만 삭제 버튼이 보이고 삭제할 수 있음

0개의 댓글