블로그의 글에 대한 리스트를 보여주고 포스트를 클릭하면 글을 읽을 수 있는 기능을 개발하려한다.
단순히 제목, 내용으로만 나눈것이 아닌, 포스트 제목 별칭, 생성날짜, 수정날짜 ,페이지 간략설명작업순서는 다음과 같이 진행할것이다.
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()는 장고 내장함수를 호출
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'
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">
«-- {{ object.get_previous }} </a>
{% endif %}
{% if object.get_next %} #다음 객체 있다면
<a href="{{ object.get_next.get_absolute_url }}"
title="View next post">{{ object.get_next }} --»</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" }}
<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" }}
<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" }}
<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" }}
<a href="{{ post.get_absolute_url }}"><strong>{{ post.title }}</strong></a></li>
{% endfor %}
</ul>
</div>
다음과 같이 그냥 blog와 blog/archive로 나눠 볼수있다!