Django 실전편ch3

김용녀·2022년 7월 18일
0
post-thumbnail

블로그의 글에 대한 리스트를 보여주고 포스트를 클릭하면 글을 읽을 수 있는 기능을 개발하려한다.

단순히 제목, 내용으로만 나눈것이 아닌, 포스트 제목 별칭, 생성날짜, 수정날짜 ,페이지 간략설명작업순서는 다음과 같이 진행할것이다.

Modeling

from django.db import models
from django.urls import reverse #url 패턴을 만들어주는 내장함수

class Post(models.Model):
    title = models.CharField(verbose_name='TITLE',max_length=50)
    slug = models.SlugField('SLUG', unique=True , allow_unicode=True, help_text='one word for title alias')
    description = models.CharField('DESCRIPTION',max_length=100, blank = True , help_text='simple description text.')
    content = models.TextField('CONTENT')
    create_dt = models.DateTimeField('CREATE DATE', auto_now_add=True)
    modify_dt = models.DateTimeField('MODIFY DATE', auto_now = True)


    class Meta:
        verbose_name = 'post'
        verbose_name_plural = 'posts'
        db_table = 'blog_posts'
        ordering = ('-modify_dt' ,)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post_detail', args=(self.slug),)

    def get_previous(self):
        return self.get_previous_by_modify_dt()

    def get_next(self):
        return self.get_next_by_modify_dt()

verbose_name 은 별칭이며, 공백으로 비울시 필드명으로 채운다.
slug컬럼은 제목의 별칭이다.단어를 이용해 제목을 작성하는 방식.url에 사용됨
auto_noew_add와 auto_now의 차이는 객체가 생성될때 시각인지, 객체가 DB에 저장될떄 시각인지(수정시간을 포함)다.
필드 속성외 필요 파라미터는 Meta에서 정의한다.
테이블 단수별칭=verbose_name 복수별칭 =verbose_name_plural
db_table = DB에 저장되는 테이블 이름을 blog_posts
get_absolute_url()는 이 메소드가 정의된 객체를 가리키는 URL을 반환
get_previous()와 get_next()는 장고 내장함수를 호출

URLconf작성

View 작성

from django.shortcuts import render
from django.views.generic import ListView,DetailView
from django.views.generic import ArchiveIndexView, YearArchiveView,MonthArchiveView
from django.views.generic.dates import DayArchiveView,TodayArchiveView

from blog.models import Post

# Create your views here.

#--ListVIew

class PostLV(ListView):
    model = Post
    template_name = 'blog/post_all.html' #템플릿파일은 해당html로 지정. 지정하지 않으면, 모델명_list.html
    context_object_name = 'posts' #템플릿에 넘겨주는 컨텍스트변수이름 'posts'
    paginate_by = 2 # 한 페이지에 보여주는 객체리스트 일단

#--DetailView

class PostDV(DetailView):
    model = Post  #지정 X 할경우. (model)_list.html로 넘어감 . Post테이블 넘어감

#여기서부터 모두 날짜 generic View
#ArchiveView
class PostAV(ArchiveIndexView): #객체 리스트 가져와, 날짜 필드 기준으로 먼저 출력
    model = Post
    date_field = 'modify_dt' #기준날짜는 modify_dt이용. 즉 변경날짜최신 우선

#### class PostYAV(YearArchiveView): #특정 연도를 기준으로 객체 리스트 가져옴 .
    model = Post
    date_field = 'modify_dt'
    make_object_list = True

class PostMAV(MonthArchiveView):
    model = Post
    date_field = 'modify_dt'

class PostDAV(DayArchiveView):
    model = Post
    date_field = 'modify_dt'

class PostTAV(TodayArchiveView):
    model = Post
    date_field = 'modify_dt'

Template작성

post_all.html -  포스트 리스트를 보여줄것이다.

<h1>Blog List</h1>
<br>

{% for post in posts %}  #post list LV뷰에서 받아옴
    <h3><a href='{{ post.get_absolute_url }}'>{{ post.title }}</a></h3>
    {{ post.modify_dt|date:"N d, Y" }}  #N d, Y포맷(날짜)
    <p>{{ post.description }}</p>
{% endfor %}

<br>   #공백

<div>
    <span>
        {% if page_obj.has_previous %} #이전페이지가 있다면,링크달아주기
            <a href="?page={{  page_obj.previous_page_number }}">PreviousPage</a>
        {% endif %}

        Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}  #페이지 수 보여주기

        {% if page_obj.has_next %} #다음페이지 있다면,링크달아주기
            <a href="?page={{ page_obj.next_page_number }}">NextPage</a>
        {% endif %}
    </span>

</div>

for문을 통해 객체 리스트를 보여준다. 그리고 description 요약내용과,
previous와 paginatior를 통해 다음페이지를 보여줌.

post_detail.html - 기사 누를경우 자세한 내용 볼수있음

<h2>{{ object.title }}</h2>  #DV 클래스뷰에서 넘어온 컨텍스트변수

<p>
    {% if object.get_previous %}   #이전 순서 객체 있다면,
    	<a href="{{ object.get_previous.get_absolute_url }}" title="View previous post">
        &laquo;-- {{ object.get_previous }} </a>
    {% endif %}

    {% if object.get_next %}  #다음 객체 있다면
    	<a href="{{ object.get_next.get_absolute_url }}" 
        title="View next post">{{ object.get_next }} --&raquo;</a>
    {% endif %}
</p>

<p>{{ object.modify_dt|date:"j F Y" }}</p> #객체의 날짜를 J F Y형식으로 본다.
<br>

<div>
    {{ object.content|linebreaks }}  #포스트 객체의 내용(content속성값 출력), linebreaks템플릿필터는 \n인식
</div>

object.get_previous.get_absolute_url을 통해 기사에 들어가서 이전 페이지의 다른 기사도 볼 수 있다. 또한 다음 페이지(객체)의 기사도 볼수 있다.

post_archive.html- post리스트를 날짜별로 구분해서 보여준다.

<h1>Post Archives until {% now "N d, Y" %}</h1> #날짜 형식지정
<ul>
    {% for date in date_list %}  #DateQuerySet담은 컨텍스트변수
    <li style="display: inline;"> 
        <a href="{% url 'blog:post_year_archive'   date|date:'Y' %}">Year-{{ date|date:"Y" }}</a></li>
        #위에서 뽑아낸 변수 Y 연도를 뽑아내고 연도에url링크 달아놓음
    {% endfor %}
</ul>
<br/>

<div>
    <ul>
        {% for post in object_list %} 
        <li>{{ post.modify_dt|date:"Y-m-d" }}&nbsp;&nbsp;&nbsp;
        <a href="{{ post.get_absolute_url }}"><strong>{{ post.title }}</strong></a></li>
        {% endfor %}
        #수정날짜들과 해당 포스트들의 url뽑아냄
    </ul>
</div>


post_archive_year.html  -archive에서 연도 눌렀을떄 들어간화면,
<h1>Post Archives for {{ year|date:"Y" }}</h1>

<ul>
    {% for date in date_list %}
    	<li style="display: inline;">
       	 <a href="{% url 'blog:post_month_archive' year|date:'Y' date|date:'b' %}">{{ date|date:"F" }}</a></li>   #Y년도에 해당하는 월만 뽑아냄
    {% endfor %}
</ul>
<br>

<div>
    <ul>
        {% for post in object_list %}
       		 <li>{{ post.modify_dt|date:"Y-m-d" }}&nbsp;&nbsp;&nbsp;
        	<a href="{{ post.get_absolute_url }}"><strong>{{ post.title }}</strong></a></li>
        {% endfor %}  #수정날짜 기준으로 날짜와 포스트url
    </ul>
</div>   
post_archive_month.html #월(month)눌렀을때 들어간화면

<h1>Post Archives for {{ month|date:"N, Y" }}</h1>


<div>
    <ul>
        {% for post in object_list %}  #object_list에는 누른 month밖에없다
        	<li>{{ post.modify_dt|date:"Y-m-d"  }}&nbsp;&nbsp;&nbsp;
        	<a href="{{ post.get_absolute_url }}"><strong>{{ post.title }}</strong></a></li>
        {% endfor %}
    </ul>
</div>

post_archive_day.html

<h1>Post Archives for {{ day|date:"N d, Y" }}</h1>
#datetime.date 타입의 컨텍스트 변수가 넘어옴
<div>
    <ul>
        {% for post in object_list %} #해당 날짜
       		<li>{{ post.modify_dt|date:"Y-m-d" }}&nbsp;&nbsp;&nbsp;
       		<a href="{{ post.get_absolute_url }}"><strong>{{ post.title }}</strong></a></li>
        {% endfor %}
    </ul>
</div>



다음과 같이 그냥 blog와 blog/archive로 나눠 볼수있다!

profile
어서오세요

0개의 댓글