본문 바로가기

programming/Gukbi

국비 교육 104일차 - django project (include, page block.. )

728x90
반응형

게시판에 이어서 여러 데이터를 출력하고 뿌리는 프로젝트를 완성해나가고 있다. 다 볼 필요는 없을거 같고 중요한 부분 몇가지만 추려서 개인 프로젝트에 적용도 하고 블로깅으로 기록도 남길 생각이다.

 

 

 

페이지 블록 나누기

 

일단 필요한 값을 dao에서 보내준다. 이때 필요한 정보는 totalpage, 즉 몇 페이지까지 있는지에 대한 정보가 필요하다. 

def movie_list(page):
    conn=getConnection()
    cursor=conn.cursor()
    rowSize = 12
    start = (rowSize * page) - (rowSize - 1)
    end = rowSize * page
    sql = f"""
                SELECT mno,poster,title,num
                FROM (SELECT mno,poster,title,rownum as num
                FROM (SELECT /*+ INDEX_ASC(daum_movie dm_mno_pk) */ mno,poster,title
                FROM daum_movie))
                WHERE num BETWEEN {start} AND {end}
              """
    cursor.execute(sql)
    movie_data = cursor.fetchall()
    #print(movie_data)
    cursor.close()
    conn.close()
    return movie_data

 

값을 넘겨주면 views.py에서 처리를 잘 해주어야 한다.

def home(request):
    try:
         page=request.GET['page']
         curpage=int(page)
    except Exception as e:
          curpage=1
    movie_data=models.movie_list(curpage)
    md=[]
    for row in movie_data:
        data={"mno":row[0],"poster":row[1],"title":row[2]}
        md.append(data)

    block=5
    startPage=((curpage-1)//block*block)+1
    endPage=((curpage-1)//block*block)+block
    totalpage=models.movie_totalpage()
    totalpage=int(totalpage)
    if endPage>totalpage:
        endPage=totalpage

    print("startPage="+str(startPage))
    print("endPage="+str(endPage))

    return render(request,'total/home.html',{"curpage":curpage,"totalpage":totalpage,"startPage":startPage,"endPage":endPage,"md":md,"range":range(startPage,endPage+1)})

 

일단 페이지 정보를 Get방식으로 받아오고, 해당하는 리스트를 전송한다. 페이지 블록은 5개 단위로 나눠준다.

html에서는 수식 계산이 안되기 때문에 range를 계산해서 보내준다. 파이썬의 경우 마지막은 range에 포함이 되지 않기 때문에 꼭 +1을 해서 보내줘야 한다. 

 

 

 

 

그리고 html에서 받아와서 처리

<div class="row">
             <div class="text-center">
                 <ul class="pagination">
                     {% if startPage > 1 %}
                     <li><a href="../total/?page={{startPage|add:-1}}">&lt;</a></li>
                     {% endif %}
                     {% for i in range %}
                        {% if i == curpage %}
                          <li class="active"><a href="../total/?page={{i}}">{{i}}</a></li>
                         {% else %}
                          <li><a href="../total/?page={{i}}">{{i}}</a></li>
                         {% endif %}
                     {% endfor %}
                     {% if endPage < totalpage %}
                     <li><a href="../total/?page={{endPage|add:1}}">&gt;</a></li>
                     {% endif %}
                    </ul>
             </div>

조건문 사용해서 +1해주거나 -1해주면서 페이지처리를 완성한다.

 

 

include 하기

 

 

 

일단 구조는 이렇게 되어 있고, 메뉴바가 위에 존재하고 있다. 이걸 보여주기 위해서는 include를 사용해야한다. 

<nav class="navbar navbar-inverse">
  <div class="container-fluid">
    <div class="navbar-header">
      <a class="navbar-brand" href="#">Python Example</a>
    </div>
    <ul class="nav navbar-nav">
      <li class="active"><a href="/total/">Home</a></li>
      <li><a href="/total/music/">뮤직</a></li>
      <li><a href="/total/food">맛집</a></li>
      <li><a href="/total/recipe">레시피</a></li>
      <li><a href="/total/recipe">뉴스</a></li>
      <li><a href="/total/recipe">묻고답하기</a></li>
    </ul>
  </div>
</nav>

 일단 이게 메뉴바이고, 

 

<body>
     {% include 'total/menu.html' %}
     <div style="height:30px"></div>

 include자체는 이렇게 간단하게 할 수 있다. 근데 문제는 메뉴바를 include하는게 아니라 홈 화면에서 여러 화면들을 출력해야 하는데 이건 어떻게 하는건지 모른다. 여쭤봐야겠다. 

728x90
반응형