장고에서는 HTML의 Form 기능을 forms라는 클래스로 제공한다. forms.Form을 상속받은 클래스가 하나의 폼이며, 변수들이 forms.각각_Field 클래스의 인스턴스가 되어 폼 내부의 엘리먼트(input 등)를 구성한다. 이는 모델을 만들때와 비슷한 형식이다.
작년에 장고(Django) 프레임워크로 프로젝트를 진행하면서 공부했던 개발 지식을 블로그에 다시 정리하려고 합니다. 개인 위키에 정리했던 것을 옮기는 수준이라, 친절한 설명은 기대하기 어렵고, 프로그래밍 언어와 파이썬 지식이 어느정도 있어야 이해할 수 있을 것입니다.
아래 내용들은 Django 1.6~1.7 버전을 기준으로하고, "쉽고 빠른 웹개발 Django"란 책에서 1/3, 공식 위키에서 1/3, 그리고 나머지는 구글링을 바탕으로 정리한 지식입니다. 말투가 존대와 반말이 섞여있어도 이해바랍니다 :)
1 사용자 정의 Form
2 Form 구현하기
3 CSRF 문제
1 사용자 정의 Form
보통 forms.py 파일에 forms.Form을 상속받아 폼 클래스를 정의함
폼의 필드 타입 및 필드 옵션
주요 필드 타입 | 설명 |
---|---|
CharField | 문자열 |
IntegerField | 숫자 |
DateField | 날짜 (datetime.date객체) |
DateTimeField | 일시 (datetime.datetime객체) |
EmailField | 이메일 주소 |
URLField | URL 주소 |
폼의 위젯
위젯은 폼 필드를 자세히 설정하기 위한 것으로, input 관련 엘리먼트의 속성을 사전형 데이터로 전달할 수 있음
주요 위젯 타입 | 설명 |
---|---|
PasswordInput | 비밀번호 입력 필드 (type="password") |
HiddenInput | 숨겨진 입력 필드 (type="hidden") |
Textarea | textarea (<textarea>) |
FileInput | 파일 찾기 필드 (type="file") |
폼의 주요 API
주요 API | 설명 |
---|---|
form.is_valid() | 폼의 입력값 올바른지 |
form.is_bound | 폼이 사용자 입력값을 가지고 있는지 |
form.data | 사용자가 입력한 폼 데이터 |
form.cleaned_data | 검사를 통과한 폼 데이터 |
Form.as_p() | p태그로 폼 프린트 |
Form.as_ul() | ul태그로 폼 프린트 |
Form.as_table() | table태그로 폼 프린트 |
입력값 검사 방법
폼 클래스에 "clean_필드이름" 형식의 메서드를 추가하면, 입력값을 체크하여 검증된 입력값을 반환 하거나 올바르지 않을 경우, forms.ValidationError 예외를 발생 시킴.
2 Form 구현하기
- models.py에 폼으로 받을 데이터 정의
- forms.py에 사용자 정의 폼 클래스 정의
- views.py에 폼으로 입력받은 데이터를 어떻게 저장하고 보여줄지 정의
- templates에 폼의 템플릿 작성
- urls.py에 폼 템플릿의 url 설정
Tag를 입력받는 폼을 만드는 예제를 사용하여 구성
1.models.py에 폼으로 받을 데이터 정의
2.forms.py에 사용자 정의 폼 클래스 정의
3.views.py에 폼으로 입력받은 데이터를 어떻게 저장하고 보여줄지 정의
4.templates에 폼의 템플릿 작성
5.urls.py에 폼 템플릿의 url 설정
3 CSRF 문제
CSRF란 사이트 간 요청 위조(Cross-site request forgery)라는 웹사이트 취약점 공격 중에 하나를 뜻한다. 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다.
장고는 1.2 버전부터 이러한 CSRF 취약점을 막는 기능인 CSRF 토큰방식을 기본으로 제공한다. 모든 POST 방식의 폼 전송에는 hidden 필드로 세션에 따른 임의 키값을 전송하며, 해당 키 값이 유효한지를 매번 확인한다
사용 방법
첫째로, settings.py의 미들웨어에 아래와 같이 추가한다.
(1.6~1.7버전은 프로젝트를 생성할 때 자동으로 입력되어 있다.)
두번째로, from 태그가 있는 템플릿에 {% csrf_token %}을 입력해야 한다.
만일 미들웨어를 쓸 수 없는 경우라면, django.views.decorators.csrf 의 csrf_protect 장식자(decorator)를 쓸 수 도 있다.
특정 뷰에 대해 csrf를 적용하고 싶지 않다면 csrf_exampt 장식자를 사용한다.
'IT > └ 장고(Django) 개발' 카테고리의 다른 글
장고(Django) 개발: JQuery를 이용한 Ajax와 Autocomplete 예제 (0) | 2015.01.17 |
---|---|
장고(Django) 개발: 권한(permission) 화면 관리 (0) | 2015.01.12 |
장고(Django) 개발: 관리자(Admin) 화면 관리 (0) | 2015.01.11 |
장고(Django) 개발: 사용자 관리 (0) | 2015.01.10 |
장고(Django) 개발: MVC 패턴, 템플릿(Template) (0) | 2015.01.10 |
장고(Django) 개발: MVC 패턴, 뷰(View) (0) | 2015.01.10 |
장고(Django) 개발: MVC 패턴, 모델(Model) (0) | 2015.01.09 |
장고(Django) 개발: 프로젝트 시작과 구성 (0) | 2015.01.09 |