ACHO.pk devlog

[멋쟁이사저처럼10기] Django 블로그 만들기(글 목록 띄우기, url 계층) 본문

멋쟁이사자처럼

[멋쟁이사저처럼10기] Django 블로그 만들기(글 목록 띄우기, url 계층)

Acho 2022. 7. 6. 13:01

https://acho.tistory.com/40와 이어지는 내용입니다.

 

지금까지 데이터베이스에 등록한 Blog 객체를 전부 다 index.html(기본 페이지)에 띄우는 방법에 대해 알아보자

일단, 데이터베이스로부터 views.py로 Blog 객체들을 가져와야 한다.


 

QuerySet _ template 언어

 

views.py

from django.shortcuts import render
from .models import Blog

def home(request):
    #블로그 글들을 모조리 띄우는 코드
    posts = Blog.objects.all()  #데이터베이스로부터 전부 가져와짐
    return render(request, 'index.html', {'posts': posts})

 

index.html

<!-- 블로그 글들의 목록을 보여줄 예정 -->
{{ posts }}

 

결과물

QuerySet으로 감싸진 형태로 렌더링이 되었음을 확인할 수 있다.

QuerySet : 데이터베이스로부터 전달받은 객체 목록

 

우리가 원하는 형태로 출력하기 위해서는 template 언어를 사용해서 for문을 작성해야 한다.

 

index.html

{% for post in posts %}
	<h3>제목 : {{ post.title }}</h3>
	<h4>작성 날짜 : {{ post.date }}</h4>
	{{ post.body }}
{% endfor %}

views.py

from .models import Blog


def home(request):
    #블로그 글들을 모조리 띄우는 코드
    #posts = Blog.objects.all()  #데이터베이스로부터 전부 가져와짐
    posts = Blog.objects.filter().order_by('-date')
    return render(request, 'index.html', {'posts': posts})




#날짜를 기준으로 정렬(오름차순)
	posts = Blog.objects.filter().order_by('date')
    return render(request, 'index.html', {'posts': posts})
    
#날짜를 기준으로 정렬(내림차순-최신글)
	posts = Blog.objects.filter().order_by('-date')
    return render(request, 'index.html', {'posts': posts})

 


블로그의 상세 페이지 ( Detail Page )

글 제목을 눌렀을 때 상세 페이지로 넘어가는 기능

 

기본키를 지정하지 않으면 django는 우리가 만든 객체에 숨겨둔 기본키를 자동으로 생성한다.

Title Body Date ID(Primary Key)
첫번째 글 블로그 생성 2022-07-01 1
두번째 글 상세페이지 2022-07-04 2
세번째 글 url mapping 2022-07-13 3

 

index.html

id : django가 임의로 심어놓은 Primary Key
{% for post in posts %}
	<h3>제목 : {{ post.title }}</h3>
	<h4>작성 날짜 : {{ post.date }}</h4>
    django가 만든, 블로그 객체 생성 순서에 해당하는 보이지 않는 기본키 : {{ post.id }}
    <br>
{% endfor %}

기본키가 순차적이지 않은 이유는 내가 admin 사이트에서 잘못 올린 글을 삭제했기 때문이다.

 

 

 

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),
    
    #디테일 페이지
    path('detail/<int:blog_id>', views.detail, name='detail'),
]

#blog_id 라는 이름의 변수에 정수형으로 담아 detail 함수에 인자로 넘겨준다.


#127.0.0.1:8000/detail/1    첫번째로 생성된 글
#127.0.0.1:8000/detail/2    두번째로 생성된 글
#127.0.0.1:8000/detail/3    세번째로 생성된 글

 

index.html

블로그 글 제목을 클릭했을 때, detail이라는 문자열을 갖고 있는 url로 이동하고 싶은데, 이 url은 post.id라는 정보도 추가적인 정보가 필요하다.

{% for post in posts %}
	<a href = "{% url 'detail' post.id %}"><h3>제목 : {{ post.title }}</h3></a>
	<h4>작성 날짜 : {{ post.date }}</h4>
{% endfor %}

 

 

views.py

pk 값을 이용해 특정 모델 객체 하나만 갖고오기

객체를 갖고 오거나 404를 띄우라는 의미임

from django.shortcuts import get_object_or_404

 

Blog에 해당하는 객체를 가져오는데, pk 값이 blog_id인 객체를 가져오라는 의미 + 

urls.py의 <int:blog_id>로부터 전달된 post.id(Blog 객체)의 django가 설정한 기본키(숫자)라는 의미임

def detail(request, blog_id):
    # blog_id 번째 블로그 글을 데이터베이스로부터 갖고와서
    blog_detail = get_object_or_404(Blog, pk=blog_id)
    # detail.html로 띄워주는 코드
    return render(request, 'detail.html', {'blog_detail':blog_detail})
 

 

detail.html

<h1> 제목 </h1>
{{ blog_detail.title }}

<h2> 날짜 </h2>
{{ blog_detail.date }}

<h2> 본문 </h2>
{{ blog_detail.body }}

 

이전에 블로그 글의 기본키가 1, 4, 5, 8이었다.

아래 하이퍼링크를 클릭해 새 페이지로 들어가게 되면,,,,

url에 ...detail/8 로 되어 있음을 볼 수 있다.

내가 지금 글을 쓰고 있는 티스토리도 이런 방식으로 되어 있다.

Comments