2 minute read

저장된 데이터가 없을 때

아직 저장된 데이터가 없다면 리스트페이지가 빈 상태로 나타나게 된다.
이럴때는 {% if %} 글이 있을 때 {% else %} 글이 없을 때 {% endif %}를 사용해 데이터가 없을 때의 처리를 해주는게 사용자 경험측면에서 좋다.

페이지가 없을 때

from django.http import Http404

def post_detail(request, post_id):
    try:
        post = Post.objects.get(id=post_id)
    except Post.DoesNotExist:
        raise Http404()
    context = {"post":post}
    return render(request, 'posts/post_detail.html', context)

이렇게 try를 사용할 수도 있지만 장고에서 제공하는 더 편리한 기능이 있다.

from django.shortcuts import get_object_or_404

def post_detail(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    context = {"post":post}
    return render(request, 'posts/post_detail.html', context)

get_object_or_404를 사용해서 요청하는 페이지가 존재하지 않을 때 404페이지를 보여준다.

테스트 데이터 추가하기

사용할 데이터를 데이터베이스에 추가하는 것을 seeding이라 한다.
테스트에 필요한 데이터를 준비하거나 초기 데이터를 입력해야 하는 경우에 사용하면 된다.

시드파일 json형식으로 만들기

python manage.py dumpdata [앱 이름] > 파일이름.json
현재 저장되어있는 데이터들을 json형식으로 저장한다.

python manage.py dumpdata [앱 이름] –indent=[숫자] > [파일이름].json
숫자 크기정도에 따라 들여쓰기가 조절되어 정렬된다.

이런 방식들로 만들어진 json파일에 내용을 추가해준다.

시드파일 적용하기

python manage.py loaddata [seed_file]
시드파일은 JSON, XML등의 형식을 사용한다.
위의 방법들로 생성한 json파일을 적용한다.

더 많은 데이터 추가하기

위의 방법에서는 시드 데이터를 추가하기 위해 일일이 작성을 해야하는 번거로움이 있다.

django_seed를 사용하면 임의의 데이터를 자동으로 생성해준다.

pip install django-seed==0.2.2
django-seed 0.2.2버전 설치

settings.py에서 django_seed앱 추가

python manage.py seed [앱 이름] –number=[숫자]
숫자 개수만큼 데이터가 생성된다.

django-seed를 사용하면 유효성검증은 거치지 않기 때문에 주의해야 한다.

유효성 검증 뒤늦게 추가했을 때

from .models import Post


def validate_post():
    posts = Post.objects.all()
    for post in posts:
        if '&' in post.content:
            print(post.id, '번 글에 &가 있습니다.')
            post.content = post.content.replace('&', '')
            post.save()

validate_data.py를 추가하고 함수를 작성한다.
그리고 장고 쉘에서 함수를 실행시킨다.

페이지네이션

페이지네이션을 사용하려면 장고 쉘에서

from django.core.paginator import Paginator
from posts.models import Post
이렇게 페이지네이터를 임포트하고 사용할 모델을 임포트 한다.

posts = Post.objects.all()
데이터를 모두 가져온다
posts.count()
데이터의 개수를 볼 수 있다.

pages = Paginator(posts, 6)
페이지네이터에 사용할 데이터들과 한 페이지에 들어갈 개수를 넣는다.
pages.page_range
페이지 범위를 볼 수 있다.
pages.num_pages
모든 페이지의 개수를 확인할 수 있다.

page = pages.page(1)
특정 페이지를 가져온다
page.object_list
페이지의 리스트를 볼 수 있다.

page.has_next()
다음 페이지의 존재 유무를 확인할 수 있다.
page.has_previous()
이전 페이지의 존재 유무를 확인할 수 있다.

page.next_page_number()
다음 페이지의 번호를 확인할 수 있다.
page.previous_page_number()
이전 페이지의 번호를 확인할 수 있다.

페이지네이션 구현

from django.core.paginator import Paginator

def post_list(request):
    # 모든 데이터를 가져온다
    posts = Post.objects.all()
    # 페이지를 나눈다
    paginator = Paginator(posts, 6)
    # get방식에서 쿼리스트링으로 데이터가 들어오니
    # key값 page를 사용해 value를 가져온다
    # value는 가져올 페이지의 번호다
    curr_page_number = request.GET.get('page')
    # 처음 들어오면 값이 없으므로 첫페이지 '1'로 할당한다
    if curr_page_number is None:
        curr_page_number = 1
    # 해당하는 페이지를 가져온다
    page = paginator.page(curr_page_number)
    return render(request, 'posts/post_list.html', {'page': page})

템플릿

{% for post in page.object_list %}

{% endfor %}

이렇게 데이터를 출력한다.

{% if page.has_previous %}
    <a href="?page=1" class="first">first</a>
    <a href="?page={{page.previous_page_number}}" class="prev">prev</a>
{% endif %}

<span>
# 페이지 전체 개수는 현재의 페이지가 아닌 paginator가 가지고
# 있는 값이므로 page.paginator.num_pages로 접근
    <p>{{page.number}} of {{page.paginator.num_pages}}</p>
</span>
            
{% if page.has_next %}
    <a href="?page={{page.next_page_number}}" class="next">next</a>
    <a href="?page={{page.paginator.num_pages}}" class="last">last</a>
{% endif %}

페이지네이션

Tags:

Categories:

Updated:

Leave a comment