내가 작성한 질문 글 모아보기 (회원만)

Red_Panda·2021년 4월 29일
0

오늘은 자신이 작성한 질문 글만 모아서 볼 수 있도록 새로운 기능을 넣어봤다.




먼저 navbar에 로그인 상태일때만 내가 작성한 글 메뉴와, 내가 작성한 답변 메뉴 버튼을 추가했다.


그리고 question.view에 myquestion 함수를 작성해줬다.
page는 1페이지부터다.
question_list에 모든 질문 글들을 먼저 order_by를 통해 최신 작성순으로 저장했다.
그리고 question_list에 질문 글 작성자 == 현재 유저가 같을경우만 보이도록 filter를 설정했다.

와 잘나온다. 이렇게 뚝딱 해결되다니 뿌듯하다.

역시 바로 완성 했을리가 없다.
2페이지로 가기를 누르자마자 전체 리스트에서의 2페이지가 뜬다..
의도대로라면 유저가 작성한 질문 글들을 10개씩 나눠서 보여줘야한다.


그래서 이것저것 살펴보다가 내가 작성한 글만 나타내기 전용 템플릿 myqeustion.html을 만들어 적용하면 어떨까 하고 진행했다.
내용은 question_list.html과 똑같지만 밑줄 부분을 수정해줬다.

test1이 작성한 질문 글 리스트도 페이지별로 잘 나뉘어 나온다.
그리고 기존 코드를 이용해 내 질문 글 리스트들에서, 검색하거나 정렬하는 기능도 추가 했다.

@bp.route('/myquestion/')
@login_required
def myquestion():
    page = request.args.get('page', type=int, default=1)
    kw = request.args.get('kw', type=str, default='')
    so = request.args.get('so', type=str, default='recent')

    # 정렬

    if so == 'recommend':
        sub_query = db.session.query(question_voter.c.question_id, func.count('*').label('num_voter')) \
            .group_by(question_voter.c.question_id).subquery()
        question_list = Question.query \
            .outerjoin(sub_query, Question.id == sub_query.c.question_id) \
            .order_by(sub_query.c.num_voter.desc(), Question.create_date.desc())
    elif so == 'popular':
        sub_query = db.session.query(Answer.question_id, func.count('*').label('num_answer')) \
            .group_by(Answer.question_id).subquery()
        question_list = Question.query \
            .outerjoin(sub_query, Question.id == sub_query.c.question_id) \
            .order_by(sub_query.c.num_answer.desc(), Question.create_date.desc())
    elif so == 'old':
        question_list = Question.query.order_by(Question.create_date)

    else:
        question_list = Question.query.order_by(Question.create_date.desc())
    #question_list = Question.query.order_by(Question.create_date.desc())
    question_list = question_list \
            .filter(Question.user == g.user) \
            .distinct()
    if kw:
        search = '%%{}%%'.format(kw)
        sub_query = db.session.query(Answer.question_id, User.username) \
            .outerjoin(User, Answer.user_id == User.id).subquery()  # 답변자에 대한 user정보 저장 쿼리
        question_list = question_list \
            .outerjoin(Answer) \
            .outerjoin(sub_query) \
            .outerjoin(User, User.id == Question.user_id) \
            .filter(Question.subject.ilike(search) |  # 질문 제목
                    Question.content.ilike(search) |  # 질문 내용
                    User.username.ilike(search) |  # 질문 or 답변 작성자
                    Answer.ip.ilike(search) |  # 비로그인상태의 답변 작성자
                    Question.ip.ilike(search) |  # 비로그인상태의 질문 작성자
                    Answer.content.ilike(search) |  # 답변 내용
                    sub_query.c.username.ilike(search)
                    ) \
            .distinct()

    question_list = question_list.paginate(page, per_page=10)
    return render_template('question/myquestion_list.html', question_list=question_list,page=page,kw=kw, so=so)

먼저 so에 따라 question_list를 어떻게 나열할 것인지 순서를 받고 그 안에서 아까 이용한 filter로 결과 리스트를 나타냈다.
검색은 전체 리스트 검색과 똑같이 적용하면된다.
단지 검색할 범위만 내가 작성한 질문 글들로 다른 것 뿐이다.


전체 리스트에서 제목에 '안녕'이 들어간 게시글 작성자가 test1 이외에도 있다.
그럼 test1으로 로그인을하고 내 질문 글 보기 -> '안녕'을 검색하면 잘 적용되는지 확인해보자.


test1이 작성한 질문 글중에서, '안녕'이라는 내용이 담긴 질문 글들만 리스트로 잘 나온다.

전체 글 리스트로 돌아가고싶으면 홈버튼을 누르면 된다.

작동이 잘되는것을 확인해줬으니, git에 버전을 업데이트 해주고, aws서버에도 해당버전 업데이트를 적용한 뒤 도메인으로 접속해서 확인했다.


잘 적용됐다.
근데 결과 리스트에 내가 작성한 글 리스트라는 표시를 따로 해줘야겠다.
이게 어떤 결과 리스트 인지 햇갈리는듯?

조금씩이라도 계속 기능을 추가하니까 재밌다.
특히, 코드를 작성하기 전에 어떻게 할지 구상한 아이디어로 한방에 성공할 때

다음에는 내가 단 답변들만 모아보기 기능을 추가할 생각이다.
표현 방식은 내가 단 답변이 존재하는 질문글 리스트들을 나열할 생각이다.

profile
신입 개발자

0개의 댓글

관련 채용 정보