Waffle-Skile.github.io

PostDetailView

# board/views.py에 추가
from django.views.generic import DetailView
from .models import Post

class PostDetailView(DetailView):
    model = Post

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        self.object.hit += 1
        self.object.save()
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)
  1. BaseDetailView
    • Post object에 접근할 때마다 hit을 1 높여주기 위해 get()을 override했다.
    • SingleObjectMixin에 정의된 get_object()는 주어진 query에 대응되는 Model object를 반환한다.
    • SingleObjectMixin에 정의된 get_context_data()object를 dictionary로 변환한다.
    • TemplateResponseMixin에 정의된 render_to_response()context를 이용해 Model object와 Template를 매칭한다.
  2. SingleObjectTemplateResponseMixin
    • template_name 기본값 : <app_label>/<model_name>_detail.html
<!DOCTYPE html>
<!-- board/templates/board/post_detail.html -->
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>{{ object.title }} - Seminar5</title>
  </head>
  <body>
    <div class="header">
      <h1>{{ object.title }}</h1>
      <p>
        Created at <em>{{ object.created_at }}</em><br>
        Modified at <em>{{ object.modified_at }}</em>
      </p>
      <p><b>Hit:</b> {{ object.hit }}</p>
      {% if object.get_previous_by_created_at %}
      <p>
        <a href="{% url 'post_detail' object.get_previous_by_created_at.pk %}">
          Previous - <b>{{ object.get_previous_by_created_at.title }}</b>
        </a>
      </p>
      {% endif %}
      {% if object.get_next_by_created_at %}
      <p>
        <a href="{% url 'post_detail' object.get_next_by_created_at.pk %}">
          Next - <b>{{ object.get_next_by_created_at.title }}</b>
        </a>
      </p>
      {% endif %}
    </div>
    {% if messages %}
    <ul class="messages">
      {% for msg in messages %}
      <li>{{ msg }}</li>
      {% endfor %}
    </ul>
    {% endif %}
    <div class="content">
      {{ object.content|escape|linebreaks }}
    </div>
    <div class="footer">
      <a href="{% url 'post_update' object.pk %}">Edit</a>
      <a href="{% url 'post_list' %}">Back</a>
    </div>
  </body>
</html>
  1. {{ object.content|escape|linebreaks }}|escape|linebreaksDTL의 Filter 문법이다.
    • escape : HTML 문서에 사용되는 특수기호를 escape한다. (<에서 &lt;로 바꾸는 등)
    • linebreaks : 일반 텍스트의 강제 개행을 <br>이나 <p> 태그로 바꿔준다.
  2. {% if messages %}PostDeleteView에서 django.contrib.messages를 사용하기 위함
  3. get_previous_by_FOO: Not Null인 DateField/DateTimeField에 대해서 제공되는 기능
    • FOO에는 모델의 필드 이름인 created_at을 집어넣었음.
    • Post Object를 반환하므로, pk나 title 등 속성에 자유롭게 접근 가능
    • cf. Model.get_previous_by_FOO()

Go back to Lecture 5