<본 강좌는 Mike Hibbert에 의해 제작되었으며, 제가 정리한 내용이 도움이 된다고 생각되시면 반드시 유투브 페이지에 방문하셔서 추천과 구독을 눌러주세요>

 

이번 강좌에서는 전 강좌에서 urls.py를 app안에 넣었던 것과 같이 templates을 app안에서 쓸 수 있는 방법을 소개한다고 합니다.

template의 modulerize라고 하는데...뭐 자세한 내용은 동영상을 들으시고,

우선 template을 최초에 만든 django_test/templates 에서도 쓸수 있고, article/templates에서도 쓸수 있으려면 어떻게 해야 할까요?

 

이 경우에는 django_test/settings.py를 변경하면 된다.

위 화면 가장 하단에 있는 TEMPLATE_DIRS = ( ROOT_PATH + '/templates') 으로 되어 있던 설정을 다음과 같이 변경한다.

TEMPLATE_DIRS = ( ROOT_PATH + '/templates',
                  ROOT_PATH + '/articles/templates',
)

위와 같이 변경할 경우 articles/templates에서도 지정한 html 파일이 있는지 확인하기 시작한다.

따라서, article app에 해당하는 내용에 대한 template들만 별도로 모아서 관리할 수 있게 됐다고 볼 수 있다.

Django에서 제공하는 Template 문법

자 그럼 django에서 제공하는  template 문법을 보다 구체적으로 살펴보도록 하자.

전장에서 쓴 articles.html파일의 내용을 보면 다음과 같다.

{% for article in articles %}   
<div>

   <h2><a href="/articles/get/{{ article.id }}/">{{article.title}}</a></h2>
   <p>{{article.body}}</p>

 </div>
{% endfor %}

 

 

<결과 화면>

위에 출력되는 내용들을 django template문법으로 제공하는 일부 기능을 제공하면 다른 결과를 얻을 수 있다.

Django 문법은 "|" 를 사용한다.

예를들어 <p>{{article.body}}</p> 를 <p>{{article.body|upper|truncatewords:"10"}}</p> 와 같이 변경하면,

출력되는 내용이 upper 즉 모두 대문자로 변경되며, truncatewords:"10"는 출력되는 글의 길이가 10으로 조정되고 나머지는 ...으로 요약 된다.(lower로 변경하면 모두 소문자가 된다.)

{% for article in articles %}
  <div>
   
   <h2><a href="/articles/get/{{ article.id }}/">{{article.title}}</a></h2>
   <p>{{article.body|upper|truncatewords:"10"}}</p>
   
   
  </div>
{% endfor %}

 

 <결과화면>


 

django Template에서는 python의 if문과 유사한 if문을 제공한다.]

아래와 같이 if문을 쓰는 방법은 python문법과 거의 동일하다고 보면 된다.

{% if articles.count > 0 %}
  {% for article in articles %}
  <div>
   
   <h2><a href="/articles/get/{{ article.id }}/">{{article.title}}</a></h2>
   <p>{{article.body|upper|truncatewords:"10"}}</p>
   
   
  </div>
  {% endfor %}
  
  
{% else %}

 <p>None to show!!</p>
 
{% endif %}

 <결과화면>

if문에서 <를 반대로 설정하면 else에 설정해 놓은 구문이 출력된다.

{% if articles.count < 0 %}
  {% for article in articles %}
  <div>
   
   <h2><a href="/articles/get/{{ article.id }}/">{{article.title}}</a></h2>
   <p>{{article.body|upper|truncatewords:"10"}}</p>
   
   
  </div>
  {% endfor %}
  
  
{% else %}

 <p>None to show!!</p>
 
{% endif %}

<결과화면>

 

 

다음으로는 기본적인 layout을 설정하는 방법을 보자. 어찌보면 가장 핵심적인 내용인데, Tutorial에는 나중에 나온다.ㅎㅎ

우선 기본적인 layout역할을 할 파일을 articles/templates에 base.html이란 이름으로 만들어보자

 

 

 

base.html에 들어갈 내용은 다음과 같다.

<!DOCTYPE html>
<html lang="en">
 
 <head>
  <title> {% block title %}My Base Template{% endblock %}</title>
  <style type="text/css">
   body {
    text=align:center;
   }
   
   #page {
    width:960px;
    text-align:left;
    margin: 10px auto 20px auto;
    background-color:#0c0c0c;
    
   }
   
   #sidebar {
    
    float: left;
    width: 200px;
    border: 1px solid #000;
   } 
   #content {
    float: left;
    width: 600px;
    border: 1px solid #f00;
    padding: 10px;
    }
      
  </style>
  
 </head>
 <body>
  <div id="page">
   
   
  </div>
  <div id="sidebar">
   {% block sidebar %}
   <ul>
    <li><a href="/articles/all"> Articles </a></li>
    <li><a href="/admon/"> Admin</a></li>
    
   </ul>
   {% endblock %}
  </div>
  <div id="content">
   
   {% block content %}This is content area {% endblock %}
   
  </div>
 </body>
 
 
</html>

약간의 css가 들어가서 다소 복잡해 보일 수 있으나 핵심은 {% block something %}으로 정리되는 부분이다.

기본적인 layout 외 변경이 될 부분들을 {% block somting %}{% endblock %}으로 설정해 놓으면 그 부분에 변경될 내용을 HTML파일로 만들어서 삽입할 수 있게 된다. 좀 더 쉬운 이해를 위해서 위 파일을 브라우져에서 실행한 화면을 보자.

 

위 화면을 보면 {% block sidebar %}{% endblock %}과 {% block content %} {% endblock %}으로 설정된 두 영역이 보인다.

위 두 영역은 다른 html 파일을 만들어서 {% extends 'base.html' %} 을 입력하면 기본 layout으로 사용할 수 있고, 삽입을 원하는 영역을 선택하기 위해서 {% block sidebar %} 또는 {% block content %}을 입력하면 html에 작성된 내용이 layout 상의 block 영역에 삽입된다.

아까 만들었던 articles.html / article.html 파일을 적용시키면 다음과 같다.

articles.html

{% extends 'base.html' %}

{% block content %}
  
{% if articles.count > 0 %}
  {% for article in articles %}
  <div>
   
   <h2><a href="/articles/get/{{ article.id }}/">{{article.title}}</a></h2>
   <p>{{article.body|upper|truncatewords:"10"}}</p>
   
   
  </div>
  {% endfor %}
  
  
{% else %}

 <p>None to show!!</p>
 
{% endif %}

{% endblock %}
 

<결과 화면>


article.html

{% extends 'base.html' %}
{% block sidebar %}
<ul>
 <li><a href="/articles/all"> Articlse</a></li>
 <li><a href="/admin/"> Admin</a></li>
</ul>
{% endblock %}

{% block content %}

  <h1> {{article.title}}</h1>
  <p>{{article.body}}</p>
 
{% endblock %}

 <결과 화면>

 

 

 


 

 

<본 강좌는 Mike Hibbert에 의해 제작되었으며, 제가 정리한 내용이 도움이 된다고 생각되시면 반드시 유투브 페이지에 방문하셔서 추천과 구독을 눌러주세요>

Tutorial5은 django의 admin 페이지에 models.py에 만들어놓은 model을 admin에서 직접 보고 관리할 수 있도록 설정하는 것을 보여준다.

 

 

이클립스에서 django 프로젝트를 생성하고, 프로젝트에서 app을 만들면 app폴더 안에 admin.py 파일이 기본적으로 존재한다.

 

article/admin.py 를 열면 아래와 같이 출력이 된다.

위와 같이 나온 화면에 다음과 같이 추가하면 admin페이지에 models.py에 정의한 각각의 Table이 등록된다.

 

 

 

admin.py를 모두 작성하였으면, django_test/urls.py로 들어가서 admin으로 접속할 수 있는 url이 있는지 확인한다. 이클립스를 사용할 경우 기본적으로 입력되어 있으나, 만약 없을 경우에는 아래와 같이 admin 페이지로 이동할 수 있는 경로 url(r'^admin/', include(admin.site.urls)),를 만들어 준다.

 

그리고, http://127.0.0.1:8888/admin/ 을 브라우저에 입력하면 admin 페이지에 접속할 수 있다. 만약 id와 password를 묻는다면, syncdb를 처음 할 때 입력했던 계정 정보를 입력하도록 한다.

 

 

admin 화면에서 Articles에 들어가면 models.py에서 작성한 class Article의 결과물을 직접 눈으로 볼 수 있으며 데이터의 입출력 또한 자유롭게 할 수 있다.

 

 

 

 

 

<본 강좌는 Mike Hibbert에 의해 제작되었으며, 제가 정리한 내용이 도움이 된다고 생각되시면 반드시 유투브 페이지에 방문하셔서 추천과 구독을 눌러주세요>

Tutorial4에서는 views.py와 urls.py를 이전 Tutorial에서 정해져 있는 위치가 아니라 각각의 기능에 맞춰 분리하여 별도로 관리하는 방법에 대해서 설명을 한다.

django 프로젝트를 만들면 urls.py는 기본적으로 프로젝트명과 동일한 하위 폴더에 생성이 된다.

 그러나, 이번 Tutorial4에서는 프로젝트 내 생성된 App인 article 내부에 urls.py를 만들고 활용하게 된다.

 

 

 

이렇게 만들었을 때 관건은 결국 django_test/urls.py로 들어온 요청을 어떻게 article/urls.py로 연결하는것인데 생각보단 간단하다.

django_test/urls.py 파일에 r'^articles/'(articles로 들어온 모든 요청을) include('article.urls')(article.urls에서 찾아) 을 추가하면 된다.

from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'django_test.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    (r'^articles/', include('article.urls')),
   
    url(r'^admin/', include(admin.site.urls)),
    url(r'^hello/$', 'article.views.hello'),
    url(r'^hello_template/$', 'article.views.hello_template'),
    url(r'^hello_template_simple/$', 'article.views.hello_template_simple'),
   
   
)

이렇게 작성해 놓으면 http://127.0.0.1:8888/articles/ 로 접속했을 때, article/urls.py로 이동해서 path를 찾게 된다.

따라서 아래와 같이 article/urls.py에 아래와 같이 작성하면 http://127.0.0.1:8888/articles/all 이라고 할 경우 article/views.py에서 articles라는 함수를 찾게 된다.

 

from django.conf.urls import patterns, include, url

urlpatterns = patterns ('',

        url(r'^all/$', 'article.views.articles'),
        url(r'^get/(?P<article_id>\d+)/$', 'article.views.article'),                       
                       
)      

 

그럼 위에서 연결시킨 것과 같이 article/views.py에 articles 함수와 articles 함수를 추가해보도록 하자.

tutorial 예제에서는 전 장에서 설명한 것과 같이 render_to_response를 통해서 간단한 함수를 제시하였다.

 


from django.template.loader import get_template
from django.template import Context
from django.shortcuts import render_to_response
from article.models import Article


# Create your views here.

def hello(request):
    name = "mike"
    html = "<html><body> Hi %s, this seems to have worked</body></html>" % name
    return HttpResponse(html)

def hello_template(request):
    name = 'mike'
    t = get_template('hello.html')
    html = t.render(Context({'name':name}))
    return HttpResponse(html)

def hello_template_simple(request):
    name = 'mike'
    return render_to_response('hello.html', {'name':name})


def articles(request):
    return render_to_response('articles.html', {'articles':Article.objects.all()})

def article(request, article_id=1):
    return render_to_response('article.html', {'article':Article.objects.get(id=article_id)})

articles 함수에서는 articles.html 파일에 db의 Article Table에 저장되어 있는 모든 내용을 호출하는 기능을 넣었고,

article 함수에서는 article.html 파일에 db의 Article Table에 저장되어 있는 모든 내용 중 id가 article_id와 동일한 데이터를 호출하는 기능을 추가하였다.

이미 알고 있겠지만 Article.objects.all()은 models.py에 class로 정의되어 만들어진 Article Table에 저장되어 있는 모든(all() 데이터를 호출한다는 의미이며, Article.objects.get(id=article_id)는 동일하지만, 모든(all()) 데이터가 아니라 id가 article_id와 동일한 데이터(get(id=article_id)만 호출한다는 의미이다.

 

article.html은 다음과 같이 작성하고,

<html>
 
 <body>
  
  <h1> {{article.title}}</h1>
  <p>{{article.body}}</p>
 
  
 </body>
 
</html>

 

articles.html은 다음과 같이 작성하자.

<html>
 <body>
  
  <h1>Articles</h1>
  {% for article in articles %}
  <div>
   
   <h2><a href="/articles/get/{{article.id}}/">{{article.title}}</a></h2>
   <p>{{article.body}}</p>
   
   
  </div>
  {% endfor %}
 </body>
 
</html>

article.html에 있는 내용은 특별히 설명이 필요 없을 듯 하나, articles.html에는 기존에 없었던 django템플릿 언어가 일부 들어가 있다.

python을 이미 익힌 사람들은 알겠지만 python과 유사하게 django 템플릿에서도 for문을 사용할 수 있는데 다음과 같다.

  • {% for article in articles %} : articles(Articles.objects.all())에 포함되어 있는 내용들을 하나 하나 article이란 이름으로 호출할 것이다.
  • {{ article.title }}: 호출되고 있는  article의 title 콜롬의 데이터를 가져온다.
  • {% endfor %}: for문을 종료 한다.

위 내용은 기존의 python문법과 유사하기 때문에 크게 어려움은 없을 것이라 생각 된다.

모든 작성을 마치고 http://127.0.0.1:8888/articles/all/ 에 접속하면 다음과 같은 화면이 뜰 것이다.

만약 Tutorial을 처음부터 차근차근 해온 사람이라면 Tutorial2에서 models.py에서 Table을 만들고 데이터를 넣는 작업을 했기 때문에 아래와 같이 출력되는 데이터들이 있을 것이나, 만약 블로그의 내용만 보고 따라온 사람들은 아무런 데이터도 나오지 않을 것이다.

이 경우에는 앞에 Tutorial2의 동영상을 참고 부탁 한다.(17분 30초 이후부터 보면 데이터를 cmd창에서 Shell화면을 호출하여 입력하는 강의가 나온다.) 사실 admin에 들어가서 데이터를 직접 입력하는게 더 간단하지만 다음 Tutorial이라 그 장에서 설명하려 한다.

 

 

 

 


 

 

 

+ Recent posts