본문 바로가기
Spec UP - Backend/Django로 배우는 쉽고 빠른 웹개발 파이썬 프로그래밍

chap 4. Django의 핵심 기능

by TIS_Ha 2024. 3. 18.
반응형

4.1 Admin 사이트 꾸미기

장고의 Admin 사이트는 데이터를 쉽게 관리할 수 있도록 데이터의 생성, 조회, 변경, 삭제 등의 기능을 제공한다.

또한, 깔끔하게 정돈된 모습의 룩앤필 UI를 제공하며 취향에 맞게 꾸밀 수 있다.

장고 설치 디렉터리 확인 명령어는 아래와 같다.

python -c "import django; print(django.__path__)"

4.2 장고 파이썬 셸로 데이터 조작하기

Admin 사이트의 장점 중 하나는 관리자가 UI 화면에서 데이터의 조회, 입력, 수정, 삭제 등의 기능을 제공한다는 점이다.

장고는 추가로 파이썬 셸을 이용해 데이터를 관리할 수 있는 API도 제공한다.

그래서 간단한 데이터 관리 또는 UI를 통해 데이터 모습을 확인할때는 주로 Admin 사이트를 이용해 처리하고, 복잡한 데이터 처리나 별도의 웹 브라우저 접속이 필요 없는 경우에는 셸로 데이터를 처리하는 것이 일반적이다.

 

파이썬 셸과 달리 장고 파이썬 셸은 manage.py 모듈에 정의한 DJANGO_SETETINGS_MODULE 환경 변수를 이용해 미리 mysite/settings.py 모듈을 임포트한다.

참고로, 테이블은 레코드의 모음이라고 할 수 있다.

장고의 ORM은 이러한 테이블 구조를 클래스로 표현하며, 클래스의 객체를 생성하는 것은 테이블의 레코드를 생성하는 것을 의미한다.

 

장고파이썬 셸의 데이터 처리 기능은 아래와 같다. (Create, Read, Update, Delete)

1) Create - 데이터 생성/입력

데이터 입력, 즉 테이블에 레코드를 생성하기 위해서는 필드값을 지정하여 객체를 생성한 후에 save() 메소드를 호출해야한다.

save() 명령이 실행되기 전까지는 메모리에서만 변경된 것이므로 변경사항을 데이터베이스에 반영하려면 save() 명령을 실행해야한다.

명령 내부에서는 SQL의 INSERT 문장에 해당한다.

 

2) Read - 데이터 조회

데이터베이스로부터 데이터를 조회하기 위해서는 QuerySet 객체를 사용해야한다.

* QuerySet : 데이터베이스 테이블로부터 꺼내온 객체들의 컬렉션. 필터를 사용해 조건에 맞는 레코드만 다시 추출할 수 있다.

SQL 용어로 QuerySet은 SELECT 문장에 해당하며, 필터는 WHERE 절에 해당한다.

 

조회 결과를 담으려면 테이블 정보를 담고 있는 objects 객체를 사용한다.

Question.objects.all() # Question테이블.레코드.모두

데이터베이스 용어로 Question 클래스는 테이블에 해당하고 Qeustion 객체는 특정 레코드 하나에 해당하며 objects.all()은 레코드 모두를 의미한다.

 

모든 레코드가 아니라 조건에 맞는 일부 레코드만 검색할때는 filter()와 excluede() 메소드를 사용한다.

  • filter() : 주어진 조건에 맞는 객체들을 담고있는 QuerySet 컬렉션을 반환함.
  • exclude() : 주어진 조건에 맞는 객체들을 제외한 QuerySet 컬렉션을 반환함.
  • get() : 1개의 요소만 있는 것이 확실한 경우 get() 메소드를 사용하며, 호출 결과는 QuerySet이 아니라 1개의 객체이다.

QuerySet 요소의 개수를 제한 하려면 아래와 같이 파이썬의 배열 슬라이싱 문법을 사용할 수 있다.

이는 SQL용어로 OFFSET, LIMIT 절에 해당하며 음수인덱싱은 불가하다.

Question.objects.all(5:10) #Question테이블.레코드.[인덱스5부터:인덱스10까지]

 

3) Update-데이터 수정

이미 존재하는 객체에 대한 필드값을 수정하는 경우, 필드 속성값을 수정한 후 save() 메소드를 호출한다.

update() 메소드를 사용하면 여러개의 객체를 한꺼번에 수정할 수 있다.

이는 SQL 용어로 UPDATE 절에 해당한다.

 

4) Delete - 데이터 삭제

객체를 삭제할 때는 delete() 메소드를 사용하며, 클래스의 모든 객체 즉 테이블의 모든 레코드를 사용할 때는 all()을 함께 사용한다.

delete() 메소드는 SQL 용어로 DELETE 절에 해당한다.

 

4.3 템플릿 시스템

MVT 패턴에서 사용자에게 보여주는 화면, 즉 UI를 담당하는 기능이 템플릿 시스템이다.

장고의 템플릿시스템은 템플릿 문법으로 작성된 템플릿 코드를 해석하여 템플릿 파일로 결과물을 만든다.

이렇게 템플릿 코드를 템플릿 파일로 해석하는 과정을 렌더링 이라고한다.

 

1) 템플릿 변수 # {{variable}}

템플릿 코드에서는 변수를 사용할 수 있으며, 변수는 {{ }} 중괄호 2개로 감싸준다.

변수명은 문자, 숫자, 밑줄(_)을 사용하여 정의할 수 있고, 변수의 속성에 접근할 수 있는 도트( . ) 표현식도 사용할 수 있다.

템플릿 문법에서 도트( . )를 만나면 장고는 다음순서로 찾기(lookup)를 시도한다.

예를 들어 foo.bar라는 템플릿 변수가 있다면 아래와 같이 해석한다.

  1. foo 가 사전타입인지 확인한다. 그렇다면 foo['bar']로 해석한다.
  2. foo의 속성을 찾는다. bar라는 속성이 있으면 foo.bar 로 해석한다.
  3. foo가 리스트인지 확인한다. 리스트라면 foo[bar]로 해석한다.

템플릿 시스템은 정의되지않은 변수를 사용할 때 빈문자열('')을 채운다.

이 값을 변경하려면 settings.py 파일에 "STRING_IF_INVALID" 속성을 지정하면 된다.

 

2) 템플릿 필터 # {{ value|length }}
장고의 템플릿 문법에서는 템플릿 변수에 필터를 적용하여 변수의 출력 결과를 변경할 수 있다.

필터는 파이프 ( | ) 문자를 사용한다.

 

3) 템플릿 태그

템플릿 태그는 {% tag %} 형식을 가지며, 어떤 태그는 시작태그와 끝태그를 둘다 가지고 있어야한다.

템플릿 태그는 텍스트 결과물을 만들기도하고, 템플릿 로직을 제어하기도 하며, 외부 파일을 템플릿 내로 로딩하기도 한다.

  • {% for %} : 리스트에 담겨있는 항목을 순회하는 태그.
  • {% if %} : 변수를 평가하여 True이면 바로 아래의 문장을 실행하는 태그.
  • {% csrf_token %} : POST 방식의 <form>을 사용하는 템플릿 코드에서는 CSRF 공격을 방지하기 위한 태그. 이 태그를 통해 위조된 폼 요청인지 판별하는 기능을 제공한다.(CSRF 토큰값 검증 실패 시 403 에러 발생)
  • {% url %} : URLconf를 참조하여 적합한 URL을 만드는 태그.
  • {% with %} : 특정 값을 변수에 저장하는 태그. 부하가 큰 동작의 결과를 저장하고, 다시 동일한 동작이 필요한 경우 저장한 결과를 사용해 부하를 줄이는 기능.
  • {% load %} : 사용자 정의 태그 및 필터를 로딩하는 태그

4) 템플릿 주석

  • 한줄 주석 {# 주석내용 #} : {# #} 형식을 따르며 한 문장의 전부 또는 일부를 주석처리한다.
  • 여러줄 주석{% comment "주석내용" %} : {% comment %}태그를 사용해 여러줄 주석 처리가 가능하다.

5) HTML 이스케이프

장고는 HTML에 사용되는 예약문자를, 아래와 같이 예약 의미를 제거한 문자로 변경하는 이스케이프 기능을 제공한다.

< : &lt;  / > : &gt; / ' : &#x27; / " : &quot; / & : &amp;

만약 장고의 자동이스케이프 기능을 비활성해야한다면 safe 필터를 이용하거나 {% autoescape %} 태그를 이용하여 이스케이프를 방지할 수 있다.

 

6) 템플릿 상속

부모템플릿에 뼈대를 만들고 {% block %} 태그를 통해 하위로 상속할 부분을 지정하면, 자식 템플릿에는 부모 템플릿의 뼈대를 그대로 재사용하고 {% block %} 부분만 채워주면 된다.

자식 템플릿에는 상속을 받는다는 사실을 표시하기 위해 {% extends %} 태그를 사용ㅎ안다.

 

반응형

댓글