장고 공식문서 있음.
https://www.djangoproject.com/
장고는 공식문서가 엄청 친절하게 잘되어 있다. (for developer)
모든 강의는 위 문서의 일부분에 불과하다
뭔가를 배웠다면 바로 장고문서로 가서 찾아보기
- 가능하면 영어로 보기
- 문서도 봐버릇해야 보는 눈이 생김
- 영어로 된 기술문서는 많이 봐야 잘보는 눈이 생김
Templates란?
- 데이터를 보여주는 로직 작성
- 경로 : app_name / templates
- 여기에 잇는 걸 장고가 찾을 수 있는 이유는 settings.py 안에 templates에 대한 설정이 적혀잇기 때문.
저번에 햇던거.
html 파일에서 <태그>를 이용해서 작성하면 그걸 화면으로 실행해줬다.
근데 좀 동적으로 바껴야되지 않나
그래서 html파일에다사 + data 를 더해준다
내가 data를 넘겨주면 그 내용을 반영해서 html 파일이 완성되면 되겠지?
넘겨준 data를 html 파일에 작성해 넣는 것. 이러한 데이터 표현을 위해 장고는 다양한 도구를 제공해줌
DTL(Django Template Language)
장고 템플릿 안에서만 사용하는 문법.
: dtl은 python 문법과 비슷하게 만들어져있음. 근데 python 이 동작하는건 아니야!!!! 헷갈리지마
DTL문법 4가지
1. 변수 Variable
{{ Variable }}
- view에서 넘겨준 context에 접근할 수 있음.( view에서 template으로 넘겨준 data를 context라고 함)
- . 을 사용하면 변수의 속성값에 접근할 수 있음
- render() 의 세번째 인자인 context 자리에 dict 형태로 넘겨진 데이터 중 key 값이 template에서 사용 가능한 변수가 됨.
2. 필터 Filters
{{ variable|filter }} # 버티컬 바
- 변수에 어떠한 작업을 추가적으로 더해 수정하고 싶을 때 사용한다.
ex) 대문자로 받은 DINO 라는 문자열이 오면 dino 로 보여주고 싶을 때.
- 장고의 built-in filter가 제공됨. 약 60개 정도 있음
이런것들을 외울수는 없우니깐... 장고 공식 페이지에서 찾아보면서 filter 기능을 사용하면 된다.
일부 필터는 인자를 받기도 함!!
원하는 기능을 찾을 수 없으면 커스텀 필터를 만들수도 있음
3. 태그 Tags
{% tag %}
- 반복 또는 논리를 수행해서 제어흐름을 만들거나 특수한 기능을 수행할 수 있음. (for 이나 if 같은거?)
{% if ~ %}
{% endif %}
- 일부는 시작태그와 종료태그가 있다
4. 주석 Comments
{# 한 줄 주석 #}
{% coment %}
여러 줄
주석
{% endcoment %}
1. view에서 데이터를 context에 담아서 넘겨줌
def hello(request):
context = {
'name' : 'Kinggoddino',
}
return render(request, 'hello.html', context)
2. view에서 넘겨준 context를 templates에서 받아서
hello.html 에서 {{템플릿변수}}를 이용해서 작성
<h1>Hello, {{ name }}!!!!!</h1>
context는 항상 dictionary 형태로 넘어오고,
우리는 name이라는 key값으로 접근해서 안에 들어있는 value인 Kinggoddino를 받아오게 됨.
서버 실행해보기
성공
views.py 파일
def hello(request):
name = 'kinggoddino'
tags = ['spino', 'tyranno', 'brachio', 'plesio', 'ptera']
books = ['페르마의 마지막정리', '마키아벨리 군주론', '플라톤의 대화편']
context = {
'name': name,
'tags': tags,
'books': books,
}
return render(request, 'hello.html', context)
hello.html 파일로 와서
<body>
<h1>Hello, {{ name }}!!!!!</h1>
<p> 첫번째 태그는 {{ tags }} </p>
</body>
<body>
<h1>Hello, {{ name }}!!!!!</h1>
<p> 첫번째 태그는 {{ tags.0 }} </p>
</body>
<body>
<h1>Hello, {{ name }}!!!!!</h1>
<p> 첫번째 태그는 {{ tags.0|upper }} </p>
</body>
<body>
<h1>Hello, {{ name }}!!!!!</h1>
<p> 첫번째 태그는 {{ tags.0|upper }} </p>
<p> 모든 책 목록 </p>
<p> {{ books }} </p>
</body>
<body>
<h1>Hello, {{ name }}!!!!!</h1>
<p> 첫번째 태그는 {{ tags.0|upper }} </p>
<p> 모든 책 목록 </p>
<ul>
<li> {{ books.0 }} </li>
<li> {{ books.1 }} </li>
<li> {{ books.2 }} </li>
</ul>
</body>
근데 책 목록이 1000개면
천번을 적고 있을 순 없으니까
for문으로 돌려준다.
<body>
<h1>Hello, {{ name }}!!!!!</h1>
<p> 첫번째 태그는 {{ tags.0|upper }} </p>
<p> 모든 책 목록 </p>
<ul>
{% for book in books %}
<li> {{ book }} </li>
{% endfor %}
</ul>
</body>
이렇게 적어주면!
책이 얼만큼 추가되더라도 바로바로 화면이 변화하게 된다.
오옝
근데 templates 에 있는 html 파일들 보면 공통된 부분이 개많음
Template Inheritance
- 장고는 템플릿 상속을 지원한다.
- 코드의 재사용성에 초점이 맞춰져 잇음
- 상위 템플릿에 공통이 될 부분을 정의하고, 구멍을 뚫어놓음! 이 구멍에 다른 부분이 적히게 됨
- 이 구멍 (달라질부분 ) 이 Block 이라고 함. 달라질 부분을 Block으로 만드는 Skeleton 형태!
- 하위 템플릿에서 이부분 코드를 작성함.
문법은
{% block block_name %} {% endblock block_name %}
상위 템플릿에서 하위 템플릿마다 달라질 부분을 정의
- 여러개를 뚫을수도 잇겠지? 그래서 각각의 블록에다가 블록 이름을 지정해주는 거임.
{% extends 'template_name' %}
하위 템플릿에서 상위 템플릿을 상위 템플릿을 상속해서 확장한다는 것을 명시
- 이 extends 템플릿태그는 템플릿의 가장 최상단에 위치해야함.
- 다중 상속을 지원하지 않음. a템플릿, b템플릿을 둘 다 상속받아서 c 를 만들겟다? 이런거 없음.
- a를 상속받아서 b를 만들고, b를 상속받아서 c를 만들고, 이런식으로 가는건 가능.
실전!
부모템플릿은 보통 base라는 말을 많이 씀. 그래서 base.html 파일 하나 만들어주고
공통부분 코드 그려준 다음에
body 안에다가 블록 뚫어준다.
이제 hello.html에서 상속 받아주고
블록 안에 내용 적어주기
index.html 파일도 동일
이런식으로 중복 코드를 없애줄 수 있다!!!!!!
근데 들여쓰기는 안해도 상관없음 파이썬 아니니깐.
보기 이쁘라고 하는것 뿐
근데
앱을 여러개 만든다고 생각해보자.
articles 앱
users 앱
trasaction 앱
이렇게 만들고싶은데 base.html 은 articles에 있잔아? 그럼 다른앱에서도 굳이 articles 에서 가져와야댐. 먼가 구조가 이상하다.
그래서 그냥 가장 최상위에다가 모든 앱들이 공통적으로 가져야할 템플릿들을 만들어주자.
최상위 부분에 templates 라는 폴더를 새로 생성해 준다음,
articles 폴더의 templates 에 만들엇던 base.html 을 드래그앤 드롭 해서 옮겨준다
이렇게 옮겨준 다음에 서버를 실행시켜주면!!
와웅
에러
읽어보면
index 경로에서 templates 이 존재하지 않는다.
먼 templates이 없냐면 base.html 템플릿이 없서.
장고야 이걸 왜 못찾는거니
setting 들어가서 장고가 템플릿 찾는 방법 다시 읽어보자
ㅇㅎ APP 디렉토리에서만 뒤지고 잇어서 그럼.
그래서 나머지 경로도 전부 뒤져줘 라고 말하는 부분이 DIRS 부분이다.
여기에 이렇게 적어주기
'DIRS': [BASE_DIR / 'templates'],
장고야 base 디렉토리 아래에 잇는 templates 라는 폴더를 찾아서 뒤져줘. 라는 의미다.
근데 base 디렉토리가 어딧지 나도모르는데
찾음
BASE_DIR 은 뭐냐면
현재 file 의 parent 의 parent 위치를 BASE_DIR 로 장고가 정의 해놨다. ㅇㅎ
즉 현재파일 : settings.py
의 부모 : my_first_pjt
의 부모 : my_first_pjt (전체)
'Django' 카테고리의 다른 글
[Django] #10 다중앱과 URL (0) | 2024.08.15 |
---|---|
[Django] #9 HTTP Form (0) | 2024.08.15 |
[Django] #7 장고 Template 시작하기 (0) | 2024.08.13 |
[Django] #6 장고 설계 철학 MTV pattern (0) | 2024.08.13 |
[Django] #5 요청과 응답 (0) | 2024.08.12 |