26. 메인 화면 게시판 페이징 - eungyukm/DjangoBase GitHub Wiki

메인 화면 게시판 페이징

  1. 게시판 정보를 모두 가져옵니다.
    # 게시판 정보를 가져옵니다.
    board_list = board_app.models.BoardInfoTable.objects.all()

    render_data = {
        'board_list' : board_list,
    }

    template = loader.get_template('index.html')
    return HttpResponse(template.render(render_data, request))
  1. 상위글 5개를 가져옵니다.
    # 게시판의 수 만큼 반복합니다.
    for b1 in board_list :
        # 현재 게시판에서 상위글 5개를 가져옵니다.
        c1 = board_app.models.ContentTable.objects.all().filter(content_board_idx=b1.board_info_idx)
        c1 = c1.order_by('-content_idx')[:5]
        content_list.append(c1)

        # 게시판 정보와 게시글 정보를 하나로 묶어 준다.
        board_data_list = zip(board_list, content_list)

    render_data = {
        'board_list' : board_list,
        'content_list' : content_list,
        'board_data_list' : board_data_list,
    }
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>미니 프로젝트</title>
<!-- Bootstrap CDN -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>

{% include 'top_menu.html' %}

<!-- 게시판 미리보기 부분 -->
<div class="container" style="margin-top:100px">
	<div class="row">
	{% for b1, c1 in board_data_list %}
		<div class="col-lg-6" style="margin-top:20px">
			<div class="card shadow">
				<div class="card-body">
					<h4 class="card-title">{{b1.board_info_name}}</h4>
					<table class="table table-hover" id='board_list'>
						<thead>
							<tr>
								<th class="text-center w-25">글번호</th>
								<th>제목</th>
								<th class="text-center w-25 d-none d-xl-table-cell">작성날짜</th>
							</tr>
						</thead>
						<tbody>
							{% for c2 in c1%}
							<tr>
								<td class="text-center">{{c2.content_idx}}</td>
								<th><a href='board_read.html'>{{c2.content_subject}}</a></th>
								<td class="text-center d-none d-xl-table-cell">{{c2.content_date|date:'Y-m-d'}}</td>
							</tr>
							{% endfor %}
						</tbody>
					</table>
					
					<a href="board_main.html" class="btn btn-primary">더보기</a>
				</div>
			</div>
		</div>
	{% endfor %}
	</div>
</div>

{% include 'bottom_info.html' %}

</body>
</html>
  1. 메인 페이지에서 글 제목을 클릭하면, 글보는 페이지로 전환처리
{% for c2 in c1%}
<tr>
 <td class="text-center">{{c2.content_idx}}</td>
 <th><a href='/board/board_read?board_info_idx={{c2.content_board_idx.board_info_idx}}&content_idx={{c2.content_idx}}&page_num=1'>{{c2.content_subject}}</a></th>
 <td class="text-center d-none d-xl-table-cell">{{c2.content_date|date:'Y-m-d'}}</td>
 </tr>
{% endfor %}
  1. Main App 더보기, 각 게시글 클릭 처리
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>미니 프로젝트</title>
<!-- Bootstrap CDN -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>

{% include 'top_menu.html' %}

<!-- 게시글 리스트 -->
<div class="container" style="margin-top:100px">
	<div class="card shadow">
		<div class="card-body">
			<h4 class="card-title">{{board_data.board_info_name}}</h4>
			<table class="table table-hover" id='board_list'>
				<thead>
					<tr>
						<th class="text-center d-none d-md-table-cell">글번호</th>
						<th class="w-50">제목</th>
						<th class="text-center d-none d-md-table-cell">작성자</th>
						<th class="text-center d-none d-md-table-cell">작성날짜</th>
					</tr>
				</thead>
				<tbody>
					{% for c1 in content_list %}
					<tr>
						<td class="text-center d-none d-md-table-cell">{{c1.content_idx}}</td>
						<td><a href='/board/board_read?board_info_idx={{board_info_idx}}&content_idx={{c1.content_idx}}&page_num={{page_num}}'>
							{{c1.content_subject}}
						</a></td>
						<td class="text-center d-none d-md-table-cell">{{c1.content_writer_idx.user_name}}</td>
						<td class="text-center d-none d-md-table-cell">{{c1.content_date|date:'Y-m-d'}}</td>
						
					</tr>
					{% endfor %}
				</tbody>
			</table>
			
			<div class="d-none d-md-block">
				<ul class="pagination justify-content-center">
					{% if page_prev == 0 %}
					<li class="page-item disabled">
						<a href="/board/board_main?board_info_idx={{board_info_idx}}&page_num={{page_prev}}" class="page-link">이전</a>
					</li>
					{% else %}
					<li class="page-item">
						<a href="/board/board_main?board_info_idx={{board_info_idx}}&page_num={{page_prev}}" class="page-link">이전</a>
					</li>
					{% endif %}

					{% for idx in pagenation_data %}

					{% if page_num == idx %}
					<li class="page-item active">
						<a href="/board/board_main?board_info_idx={{board_info_idx}}&page_num={{idx}}" class="page-link">{{idx}}</a>
					</li>
					{% else %}
					<li class="page-item">
						<a href="/board/board_main?board_info_idx={{board_info_idx}}&page_num={{idx}}" class="page-link">{{idx}}</a>
					</li>
					{% endif %}
					{% endfor %}

					{% if page_next == page_cnt %}
					<li class="page-item disabled">
						<a href="/board/board_main?board_info_idx={{board_info_idx}}&page_num={{page_next}}" class="page-link">다음</a>
					</li>
					{% else %}
					<li class="page-item">
						<a href="/board/board_main?board_info_idx={{board_info_idx}}&page_num={{page_next}}" class="page-link">다음</a>
					</li>
					{% endif%}
				</ul>
			</div>
			
			<div class="d-block d-md-none">
				<ul class="pagination justify-content-center">
					<li class="page-item">
						<a href="#" class="page-link">이전</a>
					</li>

					<li class="page-item">
						<a href="#" class="page-link">다음</a>
					</li>
				</ul>
			</div>
			
			<div class="text-right">
				<a href="/board/board_write?board_info_idx={{board_info_idx}}" class="btn btn-primary">글쓰기</a>
			</div>
			
		</div>
	</div>
</div>

{% include 'bottom_info.html' %}
</body>
</html>
  1. login_chk_middleware를 아래와 같이 처리 합니다.
from django.http import HttpResponse
from django.shortcuts import redirect
from django.urls import resolve

class LoginCheckMiddleware :

    def __init__(self, next_layer=None) :
        self.get_response = next_layer

    # 요청정보 처리를 하기위해 호출하는 함수
    def process_request(self, request) :
        # 검사를 하지 않을 페이지 주소s
        except_list = [
            'index', # 첫 페이지
            'join', # 회원가입
            'login', # 로그인
            'board_main', # 게시글 목록
            'logout', # 로그아웃
            'login_result', #로그인 처리
            'join_result', #회원가입 처리
        ]

        # 현재 페이지의 주소를 가져옵니다.
        now_name = resolve(request.path_info).url_name
        # print(now_name)

        # 제외 목록에 포함되어 있지 않을 경우
        if now_name not in except_list :
            # 로그인을 안했는지
            if request.session.get('login_chk') != True:
                message = '''
                        <script>
                            alert('잘못된 접근 입니다.')
                            location.href = '/'
                        </script>
                        '''
                return HttpResponse(message)

    # 응답정보를 처리하기 위해 호출하는 함수
    # 응답결과를 생성하는 작업을 수행. 요청 흐름을 통제하는 역할을 수행합니다.
    def precess_response(self, request, response) :
        return response

    # 장고에서 미들웨어르 동작시킬 때 호출하는 함수
    def __call__(self, request) :
        response = self.process_request(request)

        if response is None :
            response = self.get_response(request)

        response = self.precess_response(request, response)
        return response
⚠️ **GitHub.com Fallback** ⚠️