블로그 글의 페이지 만들기(Post)

  • model : 이미 Post 모델이 있으므로 오케이!
  • 템플릿1 : post 리스트에 링크 만들기
    • {% url 'post_detail' pk=post.pk %} 
      • {% %}: 장고 템플릿 태그
      • url : url 생성
      • 'post_detail' : 뷰 경로 -> blog.views.post_detail : blog(앱)의 뷰(views)에서 post_tail 뷰를 지칭함
      • pk=post.pk : pk가 Post 객체의 pk 필드의 값인 경우
      • pk : 데이터베이스의 각 레코드를 식별하는 primary key 의 줄임말. 
      • 참고로, Post 모델에서 primary key를 추가하지 않았기 때문에 새로운 블로그 글 생성시 pk 필드에 1, 2, 3 등으로 증가됨
#blog/templates/blog/post_list.html

{% extends 'blog/base.html' %}

{% block content %}
    {% for post in posts %}
        <div class="post">
            <div class="date">
                {{ post.published_date }}
            </div>
            <h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
            <p>{{ post.text|linebreaksbr }}</p>
        </div>
    {% endfor %}
{% endblock %}
  • urls : blog/urls.py에 URL을 만들기
    • post/<int:pk/>/  : URL 패턴
    • post/  : URL이 post 문자를 포함해야 한다
    • <int:pk>  : 정수 값을  pk라는 변수로 뷰에 전송
    • 예시> http://127.0.0.1:8000/post/5/의 입력 : 라고 입력하면, 장고가  매개변수 pk가 5인 값을  post_detail의 뷰(views.post_detail)에게 전달
#blog/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('post/<int:pk>/', views.post_detail, name='post_detail'),
]
  • views : views.py에 post_detail 추가하기
    • 매개변수 pk를 URL을 받으므로, pk를 식벽하기 위해서, 함수의 매개변수로 넣음
    • get_object_or_404를 위한 함수를 넣어줌
#blog/views.py
아래 내용을 views에 추가함

from django.shortcuts import render, get_object_or_404

def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'blog/post_detail.html', {'post': post})
  • 템플릿2: post_detail(상세 페이지) 만들기
    • 템플릿 폴더에 post_detail.html을 생성
    •  {% if ... %} ... {% endif %} : post의 게시일(published_date)이 있는지, 없는지를 확인
#blog/templates/blog/post_detail.html

{% extends 'blog/base.html' %}

{% block content %}
    <div class="post">
        {% if post.published_date %}
            <div class="date">
                {{ post.published_date }}
            </div>
        {% endif %}
        <h1>{{ post.title }}</h1>
        <p>{{ post.text|linebreaksbr }}</p>
    </div>
{% endblock %}

+ Recent posts