
Django 공부하기 ✨
참고 사이트 : 파이보 (점프 투 장고)
템플릿(templates)란 무엇인가?
- Django에서 템플릿이란 어떤 텍스트 파일을 의미한다.
- 템플릿을 통해 HTML, XML, CSV 등 어떠한 텍스트 기반 포맷의 파일도 생성할 수 있다.
- 템플릿 자세하게 알아보기 : https://taecongs.tistory.com/62
(1) 이전에 등록한 질문들을 조회 할 수 있도록 구현하기
- 생성한 Question (질문) 목록을 출력하기 위해 pybo/views.py 파일의 index 함수를 변경해야 한다.
// (1) projects/mysite/pybo/views.py 파일 수정하기
from django.http import HttpResponse // 삭제
from django.shortcuts import render // 추가된 항목
from .models import Question // 추가된 항목
def index(request):
question_list = Question.objects.order_by('-create_date')
context = {'question_list' : question_list}
return render(request, 'pybo/question_list.html', context)
- 질문 목록 데이터는 Question.objects.order_by('-create_date') 로 얻을 수 있다.
- order_by는 조회 결과 정렬하는 함수이다. order_by('-create_date') 는 작성일시를 역순으로 정렬한다. (- 기호가 붙어있다면 역방향, 없으면 순방향 정렬을 의미한다.)
- render 함수는 파이썬 데이터를 템플릿에 적용하여 HTML로 반환하는 함수이다.
(2) 템플릿(templates) 디렉터리 생성
- render 함수에서 사용한 pybo/question_list.html 템플릿 파일을 작성해야 한다.
- 우선 템플릿 파일을 저장할 디렉터리를 만들어야 한다.
- config/settings.py 파일의 TEMPLATES 항목의 설정을 변경해야 한다.
// (2-1) projects/mysite/config/settings.py 파일 수정하기
(... 생략 ...)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / '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',
],
},
},
]
(... 생략 ...)
- DIRS는 템플릿 디렉터리를 여러개 등록할 수 있도록 리스트로 되어 있다.
- 현재 프로젝트에서는 BASE_DIR / 'templates' 디렉터리 한 개만 등록한다.
// (2-2) templates 디렉터리 생성하기
(mysite) c:\projects\mysite> mkdir templates
// (2-3) 현재 프로젝트에서 사용될 폴더구조 정리
모든 앱이 공통으로 사용할 템플릿 디렉터리 - projects/mysite/templates
pybo 앱이 사용할 템플릿 디렉터리 - projects/mysite/templates/pybo
common 앱이 사용할 템플릿 디렉터리 - projects/mysite/templates/common
(3) 템플릿(templates) 디렉터리에 html 파일 생성하기
- 생성한 templates 폴더에 추가로 pybo 폴더를 생성 한 후 question_list.html 을 생성한다.
// (3) projects/mysite/templates/pybo/question_list.html 생성하기
{% if question_list %}
<ul>
{% for question in question_list %}
<li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>질문이 없습니다.</p>
{% endif %}
- 템플릿은 {% 와 %} 로 둘러쌓여 있으며, 이를 템플릿 태그라고 한다.
(4) 템플릿(templates) 태그
- 장고에서 사용하는 템플릿 태그는 분기, 반복, 객체 출력이 있다.
// (4-1) 분기
{% if 조건문1 %}
<p>조건문1에 해당되는 경우</p>
{% elif 조건문2 %}
<p>조건문2에 해당되는 경우</p>
{% else %}
<p>조건문1, 2에 모두 해당되지 않는 경우</p>
{% endif %}
// (4-2) 반복
{% for item in list %}
<p>순서: {{ forloop.counter }} </p>
<p>{{ item }}</p>
{% endfor %}
// (4-3) 객체 출력
{{ 객체 }} 또는 {{ 객체.속성 }}
| forloop 속성 | 설명 |
|---|---|
| forloop.counter | 루프내의 순서로 1부터 표시 |
| forloop.counter0 | 루프내의 순서로 0부터 표시 |
| forloop.first | 루프의 첫번째 순서인 경우 True |
| forloop.last | 루프의 마지막 순서인 경우 True |
- for 문 안에서는 forloop 객체를 사용할 수 있다.
(5) urls.py 수정하기
- 생성된 Question (질문) 목록을 클릭하는 경우 상세 URL 설정이 필요하다.
// (5) projects/mysite/pybo/urls.py 수정하기
from django.urls import path
from . import views
urlpatterns = [
path('', views.index),
path('<int:question_id>/', views.detail), // 추가된 항목
]
- question_id에는 URL 매핑시 저장된 question_id가 전달된다.
- http://localhost:8000/pybo/2/ 페이지가 요청되면 매개변수 question_id에 2가 세팅되어 detail 함수가 실행
(6) views.py 수정하기
- URL 매핑 규칙에 의해 실행되는 views.detail 함수를 만들어야 한다.
// (6) projects/mysite/pybo/views.py 수정하기
(... 생략 ...)
def detail(request, question_id):
question = Question.objects.get(id=question_id)
context = {'question': question}
return render(request, 'pybo/question_detail.html', context)
(7) question_detail.html 생성하기
- detail 함수에서 사용할 pybo/question_detail.html 템플릿을 생성한다.
// (7) projects/mysite/templates/pybo/question_detail.html 생성하기
<h1>{{ question.subject }}</h1>
<div>
{{ question.content }}
</div>'Study > Django' 카테고리의 다른 글
| [Django] URL 별칭 (9) (0) | 2023.09.12 |
|---|---|
| [Django] 템플릿 언어 (0) | 2023.09.11 |
| [Django] 관리자 사용하기 (7) (0) | 2023.09.08 |
| [Django] 모델 (6) (0) | 2023.09.08 |
| [Django] URL과 View (5) (0) | 2023.09.08 |