Django

5 - MVT 실제 코딩하기

초코chip 2023. 2. 7. 14:47

Model 코딩

DB 테이블을 생성하는 작업

 

notepad models.py  // DB 테이블 정의

notepad admins.py  // Admin 화면에 정의한 테이블 반영

python manage.py makemigrations  // DB에 변경이 필요한 사항을 추출

python manage.py migrate  // DB에 변경사항을 반영

python manage.py runserver  // 작업 내용 확인

 

 

테이블 정의

설계대로 polls 애플리케이션은 Question과 Choice 두 개의 테이블 필요

테이블은 models.py에 클래스 형태로 정의

 

멤버 변수 == 테이블 컬럼명

특징

1. PK(Primary Key) : Django는 PK를 지정하지 않아도 Not Null 및 Autoincrement 속성을 가진 id를 자동 생성

2. FK(Foreign Key) : FK는 항상 다른 테이블의 PK와 연결되므로, 연결될 클래스 이름만 지정하면 됨

3. __str__() 메소드 : 객체를 문자열로 표현할 때 사용하는 함수

 

Admin 사이트에 테이블 반영

models.py에서 정의한 테이블을 Admin 사이트에서 보이도록 등록 필수

admin.py에 해당 내용 등록

 

models.py에서 정의한 클래스 import

admin.site.register()을 이용해 Admin 사이트에 등록

 

DB변경사항 반영

테이블의 신규 생성 같은 DB에 변경이 필요한 사항을 반영해주는 작업 필요

 

마이그레이션(migrations) : DB에 대한 변경사항을 알려주는 정보

 

마이그레이션을 이용하여 아래 명령어 작성

 

DB 변경 사항들을 확인

python manage.py makemigrations

DB 변경 사항 반영

python manage.py migrate

 

 

위 명령어들 실행 후 admin사이트에 접속해보면 변경사항이 적용된 것을 확인

 

View 및 Template 코딩

설계대로 polls 애플리케이션은 3개의 페이지 필요 => 이 3개의 페이지를 위해 필요한 뷰와 템플릿 코딩

즉, 요청-처리-응답 로직이 설계

URL View Template
/polls/ index() index.html
/polls/5/ detail() detail.html
/polls/5/vote/ vote() redirect
/polls/5/result/ result() result.html

 

요청 - 처리 연결 (URLconf코딩)

urls.py에 URL과 뷰 연결

path() 함수의 인자

  1. route : URL패턴을 의미하는 문자열 ( URL 스트링 )

  2. view : 호출할 뷰 함수

  3. name : URL패턴에 이름 부여

 

urls.py의 계층화 : 프로젝트/urls.py와 애플리케이션/urls.py에 나눠서 작성 하면 계층적으로 관리 가능

  => 변경 쉬움, 확장 용이, 재사용성 증가

 

mysite/urls.py 변경 (프로젝트)

polls/urls.py 변경 (애플리케이션)

app_name 변수 : 여러 애플리케이션을 사용할 때 URL패턴 이름 충돌이 나는 것을 방지하기 위한 namespace역할 

 

index() 템플릿 작성

각 질문들로 이동할 수 있는 링크를 보여주는 곳

애플리케이션 하위에 templates 디렉토리 생성

 

index.html 내용 작성

핵심 : index.html을 작성하면서 필요한 변수 체크

  => question 객체들이 들어있는 latest_question_list 리스트 필요

 

index() 뷰 작성

 

핵심 :

1. DB import = DB 테이블 사용을 위해 Question 테이블 import

2. request 파라미터 = 뷰 함수 정의를 위해 첫번째 필수 파라미터 request 객체 정의

3. context 변수 = 객체 <--> 템플릿에서 사용할 변수명 을 매핑해주는 딕서녀리

4. render() 함수 = 템플릿에 context 변수를 적용하여 HTML 텍스트를 생성  -->  이를 담아서 HttpResponse 객체를 반환

 

detail 템플릿 작성

해당 질문에 대한 답변(투표)를 할 수 있는 곳

핵심

1. {% url %} 템플릿 태그 = urls.py에 있는 요청과 연결 짓는 태그

    'polls:vote' question.id  -->  /polls/8/vote/

2. {% csrf_token %} 템플릿 태그 = 폼을 처리하는 경우 CSRF 공격 방지를 위한 태그

 

처리해야할 변수 : question, error_message

 

detail 뷰 작성

핵심

1.  question_id 파라미터 = 전달되는 인자 받기

2.  get_object_or_404() 함수 = 첫 번째 인자는 모델 클래스, 그 뒤의 인자는 검색 조건 --> 없다면 Http404 익셉션 발생

  

 

vote 뷰 작성

투표를 처리해주는 곳

detail.html의 폼 제출을 하면 URLconf로 인하여 vote() 뷰 함수가 호출

 

핵심

1. request.POST['key값'] = 제출된 폼의 데이터에서 해당하는 키값에 해당하는 값을 반환. 없으면 .DoesNotExist예외 발생

2. .save()함수 = 변경사항을 DB 테이블에 반영해주는 함수

3. HttpResponseRedirect 객체 = 객체의 생성자에 리다이렉트할 URL 인자 전달

4. reverse()함수 = URLconf의 URL --> View 매핑 방식을 View --> URL로 거꾸로하여 URL스트링을 반환

    vs 템플릿 태그 { % url % }과 역할 동일    =>  뷰에서는 reverse(), 템플릿에서는 url태그로 url스트링 추출

 

중요 : POST방식의 폼 데이터를 처리하는 경우, 결과를 보여주는 페이지로 이동하기위해 HttpResponseRedirect 사용

 

results() 템플릿 작성

투표 결과를 확인할 수 있는 곳

 

results() 뷰 작성

 

지금까지 내용 확인하기

/polls 로 접속 - index()

 

/polls/1/로 접속 - detail(), vote()

/polls/1/results/로 접속 - results()