django-5. 뷰(View)
January 28, 2018
views.py
뷰(view) 는 어플리케이션의 ‘로직’ 을 넣는 곳이다. 뷰는 모델에서 필요한 정보를 받아와서 템플릿에 전달하는 역할을 한다.
[Post:4.모델] 에서 category와 post를 하나씩 생성 했다.
생성한 post를 템플릿을 이용하여 화면에 랜더링 해보자
이번에는 view에 404 페이지를 추가해 보았다.
views.py
import 로 get_object_or_404 를 추가해 준다. get_object_or_404( klass , * args , ** kwargs ) [소스] doseNotExist 대신 http404 모델을 발생시킨다.
[Docs: shortcut]https://docs.djangoproject.com/en/2.0/topics/http/shortcuts/
from django.shortcuts import render, get_object_or_404
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
comments = Comment.objects.filter(post=pk).order_by('created_at')
return render(request, 'blog/post/post_detail.html', {'post': post, 'comments': comments})
urls.py » url패턴 추가
urlpatterns = [ url(r'^detail/(?P<\pk>\d+)/$', views.post_detail, name='post_detail'), ]
template 만들기 pages >post > post_detail.html
{% extends 'simple.html' %}
{% load staticfiles %}
{% block simpleContents %}
<link rel="stylesheet" href="{% static 'css/post.css' %}">
<link rel="stylesheet" href="{% static 'css/comment.css' %}">
<script type="text/javascript" src="{% static 'js/post/comment.js' %}"></script>
<p class="bar_title hidden">{{post.title}}</p>
{% if user.is_authenticated %}
<div class="top_btn_area">
<a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}"><span class="glyphicon glyphicon-pencil"></span>edit</a>
<a class="btn btn-default" href=""><span class="glyphicon glyphicon-pencil"></span>delete</a>
</div>
{% endif %}
<div class="post_box row">
<div class="post_header col-sm-12">
<h1 class="title col-sm-12">{{ post.title }}</h1>
</div>
<div class="contents col-sm-12">{{ post.content|safe }}</div>
{% if post.published_date %}
<div class="published_date col-sm-6">
{{ post.published_date }}
</div>
{% endif %}
</div>
</div>
<script>
</script>
{% endblock %}
위에서 개별 페이지를 만들었으니 list를 출력하는 페이지를 만들어 보았다.
리스트를 출력할때는 django에서 제공하는 pagination을 이용하여 paging 처리를 해보았다.
blog urls.py ( _는 삭제 하고 적용 )
urlpatterns = [ url(r'^list/(?P<\category_nm>\w+)/((?P<\page_num>\d+)/((?P<\paging_cnt>\d+)/)?$', views.post_list, name='post_list'), ]
paging_cnt는 paging 갯수이다. default는viewspy에서 10으로 정한다.
blog views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Post, Category, Comment, TagModel
from django.utils import timezone
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def post_list(request, category_nm ='free', page_num=1, paging_cnt=10):
contents = Post.objects.filter(categoryCd=Category.objects.get(title=category_nm).id).filter(published_date__lte=timezone.now()).order_by('published_date')
paginator = Paginator(contents, paging_cnt)
pnm = page_num
try:
page = paginator.page(pnm)
except PageNotAnInteger: #페이지 번호가 정수가 아닐때 1페이지를 보여줌.
page = paginator.page(1)
except EmptyPage: #영역을 벗어났을때 마지막 페이지를 보여줌...
page = paginator.page(paginator.num_pages)
next_pnm = -1
if page.has_next():
next = page.next_page_number()
return render(request, 'pages/post/post_list.html', {'categoryNm':category_nm,'page': page})
templates > pages > post (생성) > post_list.html(생성)
{% extends 'simple.html' %}
{% load staticfiles %}
{% block simpleContents %}
<!-- <link rel="stylesheet" href="{% static 'css/post.css' %}"> -->
<h2>
{{categoryNm}}
</h2>
<table class="table table-striped table-hover TXTC MT50">
<caption class="HIDDEN">It is a post List, The title consists of the author's publication date.
</caption>
<colgroup>
<col width="50%"><col width="20%"><col width="30%">
</colgroup>
<thead>
<tr>
<th class="TXTC" scope="col"> title </th>
<th class="TXTC" scope="col"> author</th>
<th class="TXTC" scope="col"> date </th>
</tr>
</thead>
<tbody>
{% for post in page.object_list %}
<tr>
<td><a class="" href="/blog/detail/{{post.id}}/"><span>{{post.title}}</span> <span class='badge'>{{post.comments}}</span></a></td>
<td><span class="author">{{post.author}}</span> </td>
<td><span class="date">{{post.published_date}}</span></td>
</tr>
{% endfor%}
</tbody>
</table>
<p class="bar_title hidden">post_list</p>
<div class="TXTC">
<ul class="pagination MAUTO">
{% if page.has_previous %}
<li class="page-item">
<a class="page-link" href="{% url 'post_list' category_nm=categoryNm %}" aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">begin</span>
</a>
</li> {% endif %}
{% for n in page.paginator.page_range %}
{% if page.number == n %}
<li class="page-item active">
<span class="page-link">{{ n }}<span class="sr-only">(current)</span></span>
</li>
{% elif n > page.number|add:'-3' and n < page.number|add:'3' %}
<li class="page-item"><a class="page-link" href="/blog/{{categoryNm}}/getPost/{{n}}/">{{ n }}</a></li>
{% endif %}
{% endfor %}
{% if page.has_next %}
<li class="page-item">
<a class="page-link" href="/blog/{{categoryNm}}/getPost/{{page.paginator.num_pages}}/" aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">end</span>
</a>
</li>
{% endif %}
</ul>
</div>
{% endblock %}