코딩공부/Python Django

[django 실습] 게시판 만들기 - 템플릿 상속, url 관리하기

integerJI 2020. 2. 21. 20:52

[django] python django 게시판 만들기 - 템플릿 상속

 

템플릿 상속을 이용해 중복 코드를 한 번에 관리해 준다.

 

추가적으로 url도 app별로 묶어 관리를 해준다.


model, admin 설정 : https://integer-ji.tistory.com/89

views에 데이터 가져오기 : https://integer-ji.tistory.com/90

detail page 만들기 : https://integer-ji.tistory.com/91

setting 설정, 데이터 자르기, 정렬하기 : https://integer-ji.tistory.com/93

getbootstrap으로 홈페이지 꾸미기 : https://integer-ji.tistory.com/94


언제나 시작은 가상 환경 실행, 디렉터리 이동

source myvenv/Scripts/activate

cd crudproject/

 

 

중복 코드 확인

 

현재 홈페이지를 보면 Navbar는 기본적으로 전체 페이지에 적용되는 사항이어야 합니다.

 

디테일 페이지나 추후 만들 글쓰기, 수정, 페이지에서도 사용해야 하죠

 

그럼 해당 페이지마다 Navbar 소스를 입력해 주어야 합니다.

 

이러한 번거로움을 없애기 위해 django에서는 템플릿 상속이 존재합니다.

 

 

base.html 만들기

 

crudproject폴더에 templates 폴더 생성 그 아래에 base.html 생성

 

home.html의 내용을 모두 복사합니다.

 

      <div class="container">
        {% block content %}
        {% endblock %}
      </div>

 

base.html에는 필요 없는 for문을 빼줍니다.

 

그리고 {% block content %}, {% endblock %}를 추가해 줍니다.

 

 

setting.py 수정하기

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['crudproject/templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

 

setting.py에서 TEMPLATES를 찾아갑니다.

 

비어있는 DIRS에 본인의 프로젝트명 아래의 templates 폴더 경로를 지정해 줍니다. ( base.html이 있는 폴더 경로 )

 

작성할 때 '프로젝트명' 작은따옴표를 주의해 주세요.

 

home.html 수정하기

{% extends 'base.html' %}

{% block content %}


      {% for blog in blogs.all %}
      <div class="container"> 
      <div class="card">
        <div class="card-body">
        <h1>{{ blog.title }}</h1>
        <p>{{ blog.pub_date | date:"Y-m-d" }}</p>
        <p>{{ blog.summary }}<a href="{% url 'detail' blog.id %}"> ...자세히 보기</a></p> 
        </div>
      </div>
      </div>
      <br>
      {% endfor %}

{% endblock %}

 

home.html의 내용을 모두 지워 필요한 부분만 남겨줍니다.

 

setting.py에서 설정한 dirs로 경로를 찾고

 

찾은 base.html을 extends 하여 block content에 해당 내용이 base.html의 block content에 맞춰 들어갑니다.

 

 

확인

 

변한 건 없지만 소스가 바뀌어도 정상적으로 나오게 됩니다.

 

 

detail.html 페이지 적용하기

{% extends 'base.html' %}

{% block content %}

    <h1>{{ blog.title }}</h1>
    <p>{{ blog.pub_date }}</p>
    <p>{{ blog.body }}</p> 

    <a href="{% url 'home' %}">돌아가기</a>

{% endblock %}

 

이렇게 간단하게 3줄만 추가하면

 

 

디테일 페이지에도 Navbar가 생기게 됩니다. 

 

 

---------------------------------------------------------------------------

url 관리하기

 

url도 템플릿 상속처럼 간단하게 정리할 수 있습니다.

 

 

진행했던 프로젝트의 url을 생으로 모아봤습니다.

 

앞으로 여러 app들이 생길 것이고 그 앱을 연결하기 위해 url이 이렇게 늘어납니다.

 

이걸 대신 app별로 include 해주면

 

 

요롷게 간단하게 정리가 됩니다.

 

 

app에 urls.py 만들기

 

project에 있는 urls.py의 내용을 모두 app에 새로 만든 urls.py에 복사 붙여 넣기 해줍니다.

 

from django.urls import path
from . import views

urlpatterns = [
    path('new/', views.new, name='new'),
    path('detail/<int:blog_id>/', views.detail, name='detail'),
]

 

필요 없는 내용을 빼줍니다.

 

admin은 project에서만 관리해줘도 되기 때문에 삭제

 

from . import views는 이제 porject와 app처럼 폴더가 다른 게 아니기 때문

 

app의 urls.py는 views.py와 같이 있기 때문에 현재 폴더에서 import 해줍니다.

 

path 주소도 crudapp.views.new의 내용 중 crudapp에서 참고하는 부분을 지워줍니다.

 

project의 urls.py 수정하기

from django.contrib import admin
from django.urls import path, include
import crudapp.views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', crudapp.views.home, name='home'),
    path('crudapp/', include('crudapp.urls')),
]

 

 

from django.urls import path에 include를 추가해 주었고

 

crudapp에 있는 url을 모두 지워주고 crudapp 이란 이름으로 include를 해줍니다.

 

 

확인

 

잘 되었네요

 

이제 curdapp안에 있는 detail로 url이 변경된 모습을 볼 수 있습니다.

 

 

git push

git init

git add .

git commit -m "코멘트"

 

git push origin master

 

 

- 끝 -

 

---