일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Bellman-Ford
- DP
- B대면노래방
- 프로그래머스
- 데이터베이스
- django
- Kruskal
- 파이썬
- 함밥
- 모각코
- 소프트웨어공학
- 그리디알고리즘
- 백트래킹
- BFS
- 알고리즘
- 코드트리
- 동적계획법
- 실습
- DFS
- MyPlaylist
- codetree
- 장고
- 최소스패닝트리
- Planned
- 마라마라빔
- programmers
- minimum spanning tree
- 백준
- 종합설계
- SQL
- Today
- Total
Leta Learns
django | Pagination 본문
Paginaton : 데이터를 페이지 별로 나눠서 보내주는 것.
Paginator라는 모듈을 통해 pagination기능 제공
Paginator 사용 이유
- UI/UX적인 편리함을 제공하기 위해
- 서버 부하 줄이기 위해
blog/views.py (-> Paginator)
# 이전 import문들..
from django.core.paginator import Paginator
def home(request):
blogs = Blog.objects.all() #blog 객체를 모두 가져옴
paginator = Paginator(blogs, 3) # blogs를 3개씩 나눔
page = request.GET.get('page') # 해당 정보가 오지 않아도 넘어간다
paginated_blogs = paginator.get_page(page)
return render(request, 'home.html', {'blogs': paginated_blogs})
paginator = Paginator(blogs, 3)
#첫 번째 인자: 분할할 객체, 두 번째 인자: 한 페이지에 담길 객체 수page =
request.GET.get('page')
# 그동안 사용했던 request.GET['page'] : request에 'page'가 없으면 MultiValueDictKeyError 발생
request.GET.get('page') : request에 'page' 없으면 None 리턴.
paginated_blogs = paginator.get_page(page)
#페이지 번호를 받아서 해당 페이지 반환,
인자로 None이 들어간다면 첫 번째 페이지 반환.
blog/templates/home.html (-> 템플릿 수정)
{% extends 'base.html' %}
{% block content %}
{% if user.is_authenticated %}
{{user.location}}에 사는 {{user.university}} 다니는 {{user.nickname}}님 안녕하세요!
{% endif %}
<h1>Blog Project</h1>
<h4><a href="{% url 'blog:new' %}">New Post</a></h4>
<div class="conatainer">
{% for blog in blogs%}
<div>
<h3>{{ blog.title }}</h3>
{{ blog.id }} <br />
{{ blog.writer }} <br />
{{ blog.summary }}
<a href="{% url 'blog:detail' blog.id %}">...more</a>
</div>
{% endfor %}
</div>
<br/>
<div class="paginator">
{% if blogs.has_previous %}
<a href="?page=1">처음</a>
<a href="?page={{blogs.previous_page_number}}">이전</a>
{% endif %}
<span>{{blogs.number}}</span>
<span>of</span>
<span>{{blogs.paginator.num_pages}}</span>
{% if blogs.has_next %}
<a href="?page={{blogs.next_page_number}}">다음</a>
<a href="?page={{blogs.paginator.num_pages}}">마지막</a>
{% endif %}
</div>
{% endblock %}
<div class = "paginator">
{% if blogs.has_previous %}
# has_previous: 이전 페이지의 유무를 boolean 형태로 반환.
이전 페이지가 있다면 (첫 번째 페이지가 아니라면), if문 내부 요소들을 보여준다.
{{blogs.previous_page_number}}
# 이전 페이지 반환
{{blogs.next_page_number}}
# 다음 페이지 반환
{{blogs.paginator.num_pages}}
# 총 페이지 수 반환 (마지막 페이지)
page == 총페이지수 라면, 마지막 페이지를 의미...
<a href="?page=1">
: 쿼리스트링. 데이터를 전달하는데 사용
'?' 로 시작. '&'를 통해 여러 데이터를 동시에 전달 가능.
2021.07.18 - [Django] - 쿼리 스트링 Query String
blog/views.py (-> 최신글부터 보여주기, 원하는 데이터만 보여주기)
def home(request):
blogs = Blog.objects.order_by('-pub_date') # -를 넣어주면 역순 정렬. 내림차순: 최신글
search = request.GET.get('search')
if search == 'true':
author = request.GET.get('writer')
blogs = Blog.objects.filter(writer=author)
paginator = Paginator(blogs, 3)
page = request.GET.get('page')
paginated_blogs = paginator.get_page(page)
return render(request, 'home.html', {'blogs': paginated_blogs})
order_by()
# 데이터를 정렬해서 가져옴.
정렬 조건을 인자에 넣기. 조건에 '-' 붙이면 역순 (내림차순) 정렬.
최신순으로 정렬하기 위해 '-pub_date'를 인자로.
filter()
# 조건을 걸어서 원하는 데이터만 가져오기.
author = request.GET.get('writer')
# url에서 writer 값을 찾아오고 이를 author에 저장.
Blog.objects.filter(writer = author)
# writer 필드 값이 내가 찾는 writer값인 author인 경우의 객체를 찾는다.
=> 검색기능 구현.
예시로 간략히 설명하면,
abc라는 writer가 쓴 글을 검색하고 싶은 경우, abc를 찾아와서 author에 저장하고
writer 필드 값이 abc에 해당하는 객체를 찾는다. => 검색 기능!
url 주소에 쿼리스트링으로 입력하면 필터링 가능.
쿼리 스트링은 GET 요청으로 데이터 보낼 때 쓰는 것.
filter는 ORM에서 제공하는 기능. DB에서 조건 걸어서 데이터 추출하는 것.
view 수정 후 template도 수정
blog/templates/home.html
{% extends 'base.html' %}
{% block content %}
{% if user.is_authenticated %}
{{user.location}}에 사는 {{user.university}} 다니는 {{user.nickname}}님 안녕하세요!
{% endif %}
<a href="?search=true&writer={{user.nickname}}">내가 쓴 글</a>
...
쿼리스트링을 통해 필터링이 이루어져서 내가 작성한 글을 확인할 수 있음. (검색 기능 구현)
'Django' 카테고리의 다른 글
django | Model Extension (0) | 2021.07.18 |
---|---|
쿼리 스트링 Query String (0) | 2021.07.18 |
django | User 모델을 이용한 Signup, User 확장 (0) | 2021.07.16 |
django | User 모델을 이용한 login, logout (0) | 2021.07.13 |
django | Forms (0) | 2021.07.08 |