django-5. 뷰(View)

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 %}

image


위에서 개별 페이지를 만들었으니 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

django Docs : paginations

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>&nbsp;&nbsp;<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">&laquo;</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">&raquo;</span>
				<span class="sr-only">end</span>
			</a>
		</li>
		{% endif %}   

	</ul>
</div>
{% endblock %}

image