Web 공부/Django

다양한 상황 대처

sumiin 2022. 3. 30. 01:54
반응형
SMALL

아직 저장된 데이터가 없다면?

작성된 글이 없으므로 화면에 적절한 문구를 나타내는게 좋음

    {% if  posts%}
        <div class="post_container">
            {% for post in posts %}
                <div class="post"><a href={% url 'post-detail' post.id %}>         
                    <h2 class="title">{{post.title}}</h2>
                    <p class="date">{{post.dt_created}}</p>
                    <p class="text">{{post.content|slice:"100"}}</p>
                </a></div>  
            {% endfor %}      
        </div>
    {% else %}
        <div class="blank">
            <p>보여줄 글이 없어요.<br>첫 글을 작성해보면 어떨까요?</p>

        </div>
    {% endif %}

게시글이 없다면 문구를 나타내는 코드

 

 

가져올 데이터가 존재하지 않는다면?

에러를 발생시켜야함

404 에러를 발생시키지않으면 500 에러인 서버 에러를 발생시킴

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 : 첫번째 인자 모델에서 두번째 인자 조건의 object가 없다면 404에러를 발생시키고

object가 있을 경우에는 해당 object를 return해줌

 

초기에 필요한 데이터가 있다면?

 

시딩(seeding)

  • 사용할 데이터를 데이터베이스에 추가하는 것 
  • 테스트에 필요한 데이터 준비
  • 초기 데이터를 입력해야 하는 경우에 유용
python manage.py loaddata <seed_file>

<seed_file>은 json이나 XML 형식

 

json - 데이터를 표현하기 위해 사용하는 대표적인 포맷

{

 "data_01":{

    "title": "title_data_01",

     "content": "content_data_01"

  }

}

형식

 

사이트에서 게시물 모두 삭제하고 새로운 게시글 하나 생성

python manage.py dumpdata posts --indent=2 > posts_data.json

터미널에 명렁어 적어주면

project에 posts_data.json 파일이 생성됨

 

원하는 갯수만큼 복사해서 pk,title,content 수정해줌

 

python manage.py loaddata posts_data.json

터미널에 입력

3개 복사해줬으므로 3개의 object가 들어갔다고 뜸

 

 

잘 들어간것 확인 가능!!

 

더 많은 시드 데이터가 필요하다면?

앞에서 한 것처럼 복사해서 필드 수정하는 것은 필드가 복잡해지거나 갯수가 많아지면 사용하기 힘든 방식임

 

대량의 데이터를 생성하기위해서는 django-seed를 설치해줘야함

pip install django-seed

설치 후,

settings.py의 INSTALLED_APPS에 추가

 

 python manage.py seed posts --number=50

50개 데이터 생성 확인 가능 

대량의 데이터를 생성할 수 있지만 유효성 검증을 하진 않음에 주의!!

 

 

유효성 검증을 뒤늦게 추가했다면?

기존 데이터 유실을 최소화하며 유효성 검증해야함 

 

만약 기존의 게시글에 '&'가 포함된 글이 있는데 나중에 '&'를 쓰면 안된다는 유효성 검증을 추가한다면

나중 게시글에는 그 유효성 검증이 적용되지만 기존 게시글에는 적용되지않음

 

해야할 것 

1. 모든 포스트 데이터 가져오기
2. 각각의 포스트 데이터를 보면서 내용 안에 있는 &가 있는지 체크하기
3. 만약 &가 있다면 해당 &를 삭제 처리
4. 데이터 저장하기
from .models import Post

def validate_post():
    #1. 모든 포스트 데이터 가져오기
    posts=Post.objects.all()
    #2. 각각의 포스트 데이터를 보면서 내용 안에 있는 &가 있는지 체크하기
    for post in posts:
        if '&' in post.content:
            print(post.id,'번 글에 &가 있습니다.')
    #3. 만약 &가 있다면 해당 &를 삭제 처리
            post.content=post.content.replace('&','')
    #4. 데이터 저장하기
            post.save()
        if post.dt_modified < post.dt_created:
            print(post.id,'번 글의 수정일이 생성일보다 과거입니다.')
            post.save()

validate_data.py

 

shell에 들어가서 함수를 돌려보면 print가 되고 게시글이 수정되는 것을 확인할 수 있음

 

 

한 페이지에 데이터가 너무 많다면?

pagination을 써야함

django는 pagination 기능을 제공 

 

from django.core.paginator import Paginator
# Create your views here.
def post_list(request):
    posts=Post.objects.all()
    paginator=Paginator(posts,6)
    curr_page_number=request.GET.get('page')
    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})

views.py에서 paginator로 게시글을 6개씩 나눠서 한 페이지를 만들고 현재 page를 인자로 넘겨줌

 

 <div class="paging">
            {% 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>
                <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 %}
        </div>

pagination을 해줌

 

object_list는 전달받은 페이지에 있는 모든 포스트를 쿼리셋 형태로 접근 가능하게함

반응형
LIST

'Web 공부 > Django' 카테고리의 다른 글

Django에서 npm package(toast ui) 사용하기  (0) 2022.04.05
클래스형 뷰  (0) 2022.04.01
Form에 CSS 적용  (0) 2022.03.29
유효성 검사 (Validation)  (0) 2022.03.29
폼(Form)  (0) 2022.03.29