프로젝트/장고 웹페이지 구축

[Django] 게시판 페이징 처리 - (1)

eunjuu 2023. 9. 6. 19:16
728x90

🔖  게시판 페이징 처리를 해보자!

게시판 페이징 처리는 웹 애플리케이션에서 긴 목록의 데이터를 여러 페이지로 나누어 표시하는 기술이다. 이를 통해 사용자는 데이터를 효과적으로 탐색하고 관리할 수 있다. 거두절미하고 바로 해보도록 하겠다! 

참고 링크 : 📎 https://wikidocs.net/71240


📂 대량 테스트 데이터 만들기

페이징을 구현하기 전에 페이징을 테스트할 수 있을 정도로 충분한 데이터를 생성하자. 나는 150개 정도 만들 생각이다. 이렇게 대량의 테스트 데이터를 만드는 가장 좋은 방법은 장고셸을 이용하는 것이다. (by 점프 투 장고 위키독스...)

 

① 터미널에서 장고 셸 실행하기

python manage.py shell

실행 완료!

 

② 터미널에서 장고 셸 실행하기

from django.contrib.auth.models import User
from assignments.models import AdvancedAssignment

# 사용자 로그인
user = User.objects.get(username='enjprk41')

for i in range(150):
    assignment = AdvancedAssignment(
        title=f'Test Assignment {i + 1}',
        content=f'This is test content for assignment {i + 1}',
    )
    assignment.save()

 

나는 이 코드를 복붙했다. User 필드 때문에 코드가 좀 추가됐는데, 일단 시키는대로 한 번 해봤다.

 

 

AttributeError: Manager isn't available; 'auth.User' has been swapped for 'User.User'

 

 

아니 근데 계속 이런 오류가 생겨서.. (T.T ) ( T.T)  User 부분과 관련된 오류 같았음. 그래서 models.py의 BasicAssignment, AdvancedAssignment 두 개의 클래스에서 author 부분에 null=True를 추가했다.

 

null=True

이걸 추가하면 author 필드를 빈 칸으로 두거나 null 값을 가질 수 있다. 어차피 페이징 작업 하려고 임시로 만든 데이터라 작성자는 크게 중요하지 않을 것 같아 그냥 Null 값으로 설정할 생각이었음. 

 

그런데도,,,

 

 

이런 오류가 생겼다 Σ(=ω= ;)... 그래도 그냥 혹시나 싶어서 서버 들어가봤는데

 

이렇게 None으로 150개가 생겼다. 뭐 어쨌든 되긴 됐다.

 

잘 되네... 왜?

 

📂 Paginator

어쨌거나,,, 데이터는 생겼기 때문에 페이징 작업을 해보겠다. 장고에서 페이징을 위해 사용하는 클래스는 Paginator이다. Paginator 클래스를 사용하여 다음과 같이 index 함수에 페이징 기능을 적용해 보자.

 

심화 과제 제출 페이지만 일단 수정해봤다.

한 페이지에 게시물 10개씩!

 

 

💻 views.py

def AdvancedBlog(request):
    postlist2 = AdvancedAssignment.objects.all()

    # Paginator 객체를 생성하고 한 페이지당 10개의 아이템을 표시합니다.
    paginator = Paginator(postlist2, 10)
    # 클라이언트 요청에서 현재 페이지 번호를 가져옵니다.
    page_number = request.GET.get('page')
    # 요청된 페이지 번호로 페이지 객체를 가져옵니다.
    page = paginator.get_page(page_number)

    return render(request, 'assignments/advancedlist.html', {'page': page})

 

💻 advancedlist.html

	{% for post in page %}
...
        <!-- 페이지네이션 부분 시작 -->
            <div class="pagination">
                <span class="step-links">
                    {% if page.has_previous %}
                        <a href="?page=1">&laquo; first</a>
                        <a href="?page={{ page.previous_page_number }}">previous</a>
                    {% endif %}

                    <!-- 페이지 번호를 표시하는 부분 -->
                    {% for i in page.paginator.page_range %}
                        {% if page.number == i %}
                            <span class="current-page">{{ i }}</span>
                        {% else %}
                            <a href="?page={{ i }}">{{ i }}</a>
                        {% endif %}
                    {% endfor %}

                    {% if page.has_next %}
                        <a href="?page={{ page.next_page_number }}">next</a>
                        <a href="?page={{ page.paginator.num_pages }}">last &raquo;</a>
                    {% endif %}
                </span>
            </div>
            <!-- 페이지네이션 부분 끝 -->

 

advancedlist.html에서 주요 수정 부분!

 

views.py 수정으로 인한 게시판 리스트 파트 수정

{% for post in postlist2 %} → {% for post in page %}

 

그리고 페이지네이션이 어디 밑에 삽입되는지 확인하면 좋을 듯하다. 

 

 

게시판 리스트 바로 밑에 삽입!

오... 뭔가 된 것 같다.

 


일단 오늘은 여기까지... 페이징 생각보다 어렵다 🫠 다음 포스팅에서 디자인이나 기능적으로 더 수정하는 걸로 하겠다!

 

728x90