Jump to Django 2장 내용 정리

오지환·2023년 2월 6일
0

Back-end

목록 보기
2/2
post-thumbnail
  • 학습 목표
	- urls.py 파일을 이용해 URL과 매핑되는 뷰 함수를 관리한다.
	- 장고 ORM을 이용해 데이터베이스를 제어한다.
	- 파이보 게시판에 질문 목록과 질문 상세 기능을 만든다.
  • 2-1 URL과 뷰
장고의 특성상 프로젝트 단독으로는 아무일도 할 수 없다.
프로젝트에 기능을 추가하기 위해선 앱을 생성해야 한다.

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 분리를 했다.
  • 2-2 모델
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)
  • 2-3 장고 관리자
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(모델명, 검색 클래스)
  • 2-4 조회와 템플릿 **
1. 질문 목록 불러오기 - Question.objects.order_by('-create_date') : 작성일시 역순으로 정렬!

2. render함수에서 사용할 템플릿 파일과 이러한 템플릿 파일들을 저장한 디렉토리 만들기!
   config\settings.py에서 템플릿을 저장할 디렉토리 설정

3. 생성한 템플릿 파일의 주소를 앱 디렉토리 하위가 아닌 템플릿만을 위한 디렉토리에
   사용할 앱 디렉토리를 추가로 만들어서 저장하기

4. render 함수 사용하여 파이썬 데이터를 템플릿에 적용 및 HTML로 변환!
   render( request 객체, template name, dictionary 객체 ) 단, 세번째 인자는 optional 하며 템플릿의 HttpResponse 객체를 return!
  • 2-5 URL 별칭
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 라는 네임스페이스가 붙음!
  • 2-6 데이터 저장
1. 질문 템플릿에 답변을 저장할 수 있는 폼을 추가하기
 (form , textarea , input 태그 활용) +  POST 방식을 사용할 때, 데이터 전송에 있어서 보안 취약점을 막기 위해  {% csrf_token %} 태그를 활용한다.

2. 새롭게 정의한 별칭에 해당하는 URL 매핑 규칙을 등록하고 views.py 파일에 함수를 구현하기

3. 답변 조회를 위해 질문 상세 템플릿을 수정하기
  • 2-7 스태틱
1. static 디렉토리 만들고, settings.py에 등록하기(css를 적용하기 위해 스타일시트 파일을 사용해야함!)

2. 적용할 css 파일을 작성하고 템플릿에 적용한다. ({% load static %}과 link 태그 활용)
  • 2-8 부트스트랩
1. 디자인의 질을 높이기 위한 부트스트랩 설치(다양한 디자인 템플릿을 제공하는 웹 프레임워크)

2. static 디렉토리에 저장하고 이를 템플릿에 적용하기 ({% load static %}과 link 태그 활용)
  • 2-9 템플릿 상속
1. 여러 템플릿들의 구조를 표준화 하기 위해 틀이 되는 base.html 작성

2. {% extends 'base.html' %} , {% block content %} , {% endblock %} 태그를 활용하여 각각의 템플릿들이 base.html 템플릿을 상속받도록 설정!
  • 2-10 폼 **
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 함수와 템플릿을 수정하여 답변 등록 폼 적용하기
profile
Algorithm && Back-end && Front-end

0개의 댓글