1. 리눅스 설치
    1. sudo pip3 install Django
    2. 업그레이드 : sudo pip3 install Django –upgrade
  2. 윈도우 설치
    1. pip install Django
    2. 업그레이드 : pip install Django –upgrade
    3. 윈도우 환경에서는 python3 대신 python을 사용
  3. 장고에서의 애플리케이션 개발 방식
    1. MVT 방식 : Model, View, Template (MVC; Model, View, Controller와 유사)
  4. 프로젝트 구조 만들기
    1. 프로젝트 생성 : mysite
      1. django-admin startproject mysite
      2. 다음과 같은 폴더와 파일이 생성됨
    2. 기본 테이블 생성 : manage.py가 있는 폴더에서 실행
      1. python3 manage.py migrate
      2. migrate 명령 : 데이터베이스에 변경사항이 있을 때 이를 반영하라는 명령
      3. db.sqlite3 파일이 생성됨
    3. 실행 : manage.py가 있는 폴더에서 실행
      1. python3 manage.py runserver 0.0.0.0:8000
        1. runserver : 테스트용 웹서버
      2. http://localhost:8000  또는   http://127.0.0.1:8000
        1. 웹브라우저에서 접속한 경우 다음 그림이 나오면 정상
          /admin 과 같이 추가 폴더가 만들어진 이후에는 오류 발생함
    4. 관리자 생성
    5. http://localhost:8000/admin  : 관리자 접속
  5. 프로젝트 설정 파일 : mysite/settings.py
    1. 개발모드와 운영모드 선택
      1. DEBUG = True  : 개발모드
      2. DEBUG = False : 운영모드 <–완성한 후에는 운영모드로 변경
    2. ALLOWED_HOSTS = []
      1. 개발모드일 경우 : 127.0.0.1이 등록된것으로 인식
        1. http://localhost:8000로 접속
      2. 운영모드일 경우 : 서버의 IP주소를 반드시 써줘야 함
        1. ALLOWED_HOSTS = [‘127.0.0.1’, ‘localhost’, ‘202.31.243.99’, ‘ora.jj.ac.kr’]
        2. http://ora.jj.ac.kr:8000로 접속
        3. ALLOWED_HOSTS에 202.31.243.99만 등록하고 ora.jj.ac.kr을 등록하지 않았다면 http://ora.jj.ac.kr:8000로 접속하면 오류 발생
    3. INSTALLED_APPS : 프로젝트에 등록된 모든 애플리케이션
    4. 데이터베이스 엔진
      1. 기본 SQLite3 데이터베이스 엔진 사용
      2. 다른 DB 사용하려면 여기서 변경
    5. 타임존 지정 : ‘Asiz/seoul’ 로 변경
  6. 애플리케이션 생성 : polls
    1. cd mysite
    2. python3 manage.py startapp polls
    3. 애플리케이션 폴더와 그 하위에 필요한 파일을 생성
    4. 프로젝트에 polls 애플리케이션을 등록 : mysite/settings.py

      1. polls.apps.PollsConfig : polls폴더의 apps.py의 PollsConfig 클래스를 등록하라는 의미
  7. Model 코딩
    1. 테이블 정의 : models.py에 class 생성 -> DB에 table이 생성됨
      1. vi ./polls/models.py
    2. Admin 사이트에 테이블 반영
      1. vi ./polls/admin.py
    3. 데이터베이스 변경사항 반영 : DB Browser for Sqlite 프로그램으로 저장 내용 확인
      1. python3 manage.py makemigrations
      2. python3 manage.py migrate
    4. 작업 결과 확인
      1. http://ora.jj.ac.kr:8000/admin  : 관리자 접속
      2. Questions 에 질문 문항 추가
      3. 질문 2개를 추가한 결과
      4. Choices에 선택할 항목 여러개 추가
      5. 질문1에 3개, 질문2에 4개를 추가한 결과
  8. View와 Template 코딩
    1. 처리 흐름 설계
      1. URL                            View                 Template
      2. /polls/                        index()             index.html
      3. /polls/5/                    detail()             detail.html
      4. /polls/5/vote/          vote() -> redirect
      5. /polls/5/results/      results()           results.html
    2. URLconf 설계 – URL과 뷰 매핑
      1. URL 패턴                   View 이름       View가 처리하는 내용
      2. /polls/                        index()             index.html 템플릿을 보여줌
      3. /polls/5/                    detail()             detail.html 템플릿을 보여줌
      4. /polls/5/vote/          vote()                detail.html의 폼을 POST 방식으로 처리
      5. /polls/5/results/      results()           results.html 템플릿을 보여줌
      6. /admin/                    (장고 기능)       Admin 사이트를 보여줌
    3. 템플릿 작성 1 : 템플릿으로 index.html 파일을 생성 / views.pyindex() 함수 추가 / urls.pypath() 추가
      1. vi ./polls/views.py

        1. def index(request) : 뷰 함수 index()를 정의
        2. latest_question_list : 템플릿에게 넘겨줄 객체 이름
          1. Question 테이블에서 pub_date의 역순으로 최근 5개
        3. context : 템플릿에 넘겨주는 방식으로 이를 render()함수에게 보내줌
        4. render() : 장고의 단축함수로 context 변수를 적용하여 polls/index.html을 만들고 이를 HttpResponse객체로 반환
          1. 단축함수(shortcut function) : 공통적으로 사용되는 기능들을 장고에서 미리 개발하여 내장함수로 제공하는 함수
      2. mkdir ./polls/templates
      3. mkdir ./polls/templates/polls
      4. vi ./polls/templates/polls/index.html
      5. vi ./polls/urls.py
      6. vi ./mysite/urls.py
      7. ./polls/urls.py를 생성하지 않고 ./mysite/urls.py 1개로 운영하면 다음과 같이 만들면 됨, 이 방법보다는 위 방법이 더 효율적임
      8. 결과 확인
    4. 템플릿 작성 2 : 템플릿으로 detail.html 파일을 생성 / views.pydetail() 함수 추가 / urls.pypath() 추가
      1. vi ./polls/views.py

        1. get_object_or_404() : 모델 클래스로부터 검색 조건에 맞는 객체 조회하는 단축함수
          1. 매개변수1 : 모델 클래스
          2. 매개변수2… : 검색 조건을 여러개 사용
          3. 조건에 맞는 객체가 없으면 Http404 익셉션 발생
        2. get_list_or_404() : filter() 함수 사용, 리스트가 비어 있으면 Http404 익셉션 발생하는 단축함수
      2. vi ./polls/templates/polls/detail.html

        1. error_message : polls/views.py에 vote() 함수의 try~except에서 정의한 변수로, 에러 발생시 발생한 에러가 저장됨
        2. post : 서버 측의 데이터를 변경하는 경우 일반적으로 GET이 아니라 POST 방식을 사용
        3. csrf token : 폼을 처리하는 경우 보안 측면에서 CSRF(Cross Site Request Forgery) 공격을 방지하기 위해 제공된 기능
        4. forloop.counter : for loop를 실행한 횟수를 담는 변수
      3. vi ./polls/urls.py
      4. 실행결과
    5. 템플릿 작성 3 : 템플릿으로 results.html 파일을 생성 / views.pyvote(), results() 함수 추가 / urls.pypath() 추가
      1. vi ./polls/views.py

        1. KeyError : POST 데이터에 choice키가 없으면 KeyError 익셉션 발생
        2. Choice.DoesNotExist : 검색 조건에 맞는 객체가 없으면 Choice.DoesNotExist 익셉션 발생
      2. vi ./polls/templates/polls/results.html
      3. vi ./polls/urls.py
      4. 실행결과
error: Content is protected !!