- urls.py 파일을 이용해 URL과 매핑되는 뷰 함수를 관리한다.
- 장고 ORM을 이용해 데이터베이스를 제어한다.
- 파이보 게시판에 질문 목록과 질문 상세 기능을 만든다.
장고의 특성상 프로젝트 단독으로는 아무일도 할 수 없다.
프로젝트에 기능을 추가하기 위해선 앱을 생성해야 한다.
1. jango-admin startapp pybo 명령어를 통해 pybo앱을 생성한다.
(pybo 디렉토리가 생성되고 여러 하위 파일들도 생성)
2. config/urls.py 파일에 요청한 pybo/ 의 URL 매핑을 추가한다.
+ 장고의 urls.py 파일은 페이지 요청이 발생하면 가장 먼저 호출되는 파일로 URL과 뷰 함수 간의 매핑을 정의함.
3. 문자열을 브라우저에 출력하기 위해 views.py 내부의 index 함수를 정의한다.
- 장고 개발 흐름 정리
1. 브라우저에서 로컬 서버로 페이지 요청
2. url.py에서 URL 매핑을 확인하여 해당 매핑이 지닌 함수 호출
3. 호출한 결과를 브라우저에 반영
URL 분리
pybo 앱과 관련한 것들은 pybo 앱 디렉토리 하위에 위치해야함!
따라서 config/urls.py 파일을 아래와 같이 수정
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('pybo/', include('pybo.urls')),
]
(파일 위치 C:\projects/mysite/config/urls.py)
path('pybo/', include('pybo.urls'))의 의미는 pybo/로 시작하는 페이지를 요청하면
pybo/urls.py 파일의 매핑 정보를 읽어서 처리하라는 의미이다.
이제 pybo/로 시작하는 URL을 추가해야 할 때 config/urls.py 파일을 수정할 필요없이
pybo/urls.py 파일만 수정하면 된다.
from django.urls import path
from . import views
urlpatterns = [
path('', views.index),
]
파일 위치 C:\projects/mysite/pybo/urls.py
위와 같이 pybo/urls.py 파일을 수정하여 URL 분리를 했다.
1. python manage.py migrate 명령어를 통해 해당 앱들이 필요로 하는 데이터베이스 테이블 생성!
2. 모델 작성하기(pybo\models.py 파일 정의)
각 모델은 class 형태로 정의!
3. 작성한 모델을 토대로 테이블 생성하기(config\settings.py 파일의 INSTALLED_APPS 항목에 pybo 앱을 추가)
모델을 새로 생성하거나 수정하게 되면 makemigrations 명령을 수행하기 - 0001_initial.py 파일 생성
(테이블 작업을 수행하기 위한 작업 파일 생성하는 명령어)
이후에 migrate 명령 수행! (실제 테이블 작업을 수행하는 명령어)
4. 모델 사용하기(feat. python shell)
1. python manage.py createsuperuser 명령어를 통해 슈퍼유저 생성
2. http://localhost:8000/admin/ : 장고 관리자 페이지
3. pybo\admin.py 파일에서 새로운 모델 추가 - admin.site.register(모델명)
4. pybo\admin.py 파일에서 모델 검색 기능 추가
- 새로운 클래스 정의(search_fields 속성 : subject) & admin.site.register(모델명, 검색 클래스)
1. 질문 목록 불러오기 - Question.objects.order_by('-create_date') : 작성일시 역순으로 정렬!
2. render함수에서 사용할 템플릿 파일과 이러한 템플릿 파일들을 저장한 디렉토리 만들기!
config\settings.py에서 템플릿을 저장할 디렉토리 설정
3. 생성한 템플릿 파일의 주소를 앱 디렉토리 하위가 아닌 템플릿만을 위한 디렉토리에
사용할 앱 디렉토리를 추가로 만들어서 저장하기
4. render 함수 사용하여 파이썬 데이터를 템플릿에 적용 및 HTML로 변환!
render( request 객체, template name, dictionary 객체 ) 단, 세번째 인자는 optional 하며 템플릿의 HttpResponse 객체를 return!
1. URL 매핑에 name 속성 부여하기! (프로젝트를 하며, URL 링크 구조가 변경될 가능성이 있기 때문)
ex) path('<int:question_id>/', views.detail, name='detail'),
2. URL 별칭 사용하기
ex) <li><a href="{% url 'detail' question.id %}">{{ question.subject }}</a></li>
- /pybo/{{ question.id }} 링크를 {% url 'detail' question.id %}로 변경
3. 파라미터명 전달하기
1) 1개의 파라미터를 전달할 때
ex) {% url 'detail' question.id %} , {% url 'detail' question_id=question.id %}
2) 2개 이상의 파라미터를 전달할 때
ex) {% url 'detail' question_id=question.id page=2 %}
4. URL 네임스페이스(여러 앱을 사용할 때, URL 별칭이 중복될 가능성이 있기 때문)
1) app_name 지정 (파일 위치 : pybo/urls.py)
ex) app_name = 'pybo'
2) 템플릿에서 URL별칭에 네임스페이스 지정하기 (파일 위치 : C:\projects\mysite\templates\pybo\question_list.html)
ex) <li><a href="{% url 'pybo:detail' question.id %}">{{ question.subject }}</a></li>
- detail 앞에 pybo 라는 네임스페이스가 붙음!
1. 질문 템플릿에 답변을 저장할 수 있는 폼을 추가하기
(form , textarea , input 태그 활용) + POST 방식을 사용할 때, 데이터 전송에 있어서 보안 취약점을 막기 위해 {% csrf_token %} 태그를 활용한다.
2. 새롭게 정의한 별칭에 해당하는 URL 매핑 규칙을 등록하고 views.py 파일에 함수를 구현하기
3. 답변 조회를 위해 질문 상세 템플릿을 수정하기
1. static 디렉토리 만들고, settings.py에 등록하기(css를 적용하기 위해 스타일시트 파일을 사용해야함!)
2. 적용할 css 파일을 작성하고 템플릿에 적용한다. ({% load static %}과 link 태그 활용)
1. 디자인의 질을 높이기 위한 부트스트랩 설치(다양한 디자인 템플릿을 제공하는 웹 프레임워크)
2. static 디렉토리에 저장하고 이를 템플릿에 적용하기 ({% load static %}과 link 태그 활용)
1. 여러 템플릿들의 구조를 표준화 하기 위해 틀이 되는 base.html 작성
2. {% extends 'base.html' %} , {% block content %} , {% endblock %} 태그를 활용하여 각각의 템플릿들이 base.html 템플릿을 상속받도록 설정!
1. 질문 등록을 위해 부트스트랩의 btn btn-primary 클래스를 적용한 버튼 만들기
2. 새로운 URL 매핑과 폼을 활용하여 뷰함수를 구현하기
( {'form': form}은 템플릿에서 질문 등록시 사용할 폼 엘리먼트를 생성할 때 쓰임)
3. 질문 등록을 위한 템플릿을 수정하기( 이때, form의 action 속성은 비워둔다. -> 다른 기능을 구현할 때도 사용하기 위해)
4. question_create 함수를 수정하기
(질문 목록 화면에서 "질문 등록하기" 버튼을 클릭한 경우에는 GET 방식으로 요청, 질문 등록 화면에서 subject, content 항목에 값을 기입하고 "저장하기" 버튼을 누르면 POST 방식으로 요청)
5. 폼 레이블 속성을 변경하여 출력 언어 변경하기
6. {{ form.as_p }} 을 제거하여 수동으로 폼을 작성하기 ({{ form.as_p }} 태그는 HTML 코드가 자동으로 생성되므로 디자인 측면에서 많은 제한됌)
7. 답변 등록에도 폼을 적용하기 위해 AnswerForm 작성하기
8. view 함수와 템플릿을 수정하여 답변 등록 폼 적용하기