16
Two Scoops of Django & (Beomi / [email protected] ) 2016. 09. 26. with 1

투스쿱 장고: 장고폼의 기초와 폼 패턴(11-12장)

Embed Size (px)

Citation preview

Two Scoops of Django

장고 폼의 기초 & 폼 패턴들

이준범 (Beomi / [email protected])

2016. 09. 26.

with 장고 투스쿱 읽기모임

1

장고 폼의 기초

2

장고 폼 사용하기

Q. 장고 폼은 왜 사용하는가? A. 어떤 데이터가 외부에서 입력받은 데이터일 때 검증위해 사용

장고 폼은 보통 HTTP POST request요청에 �한 유효성 검증을 위해 사용된다. (그러나 다른 곳에서 사용하지 말란 법은 없다!)

입력받는 데이터가 변하는 경우에 각각 �응하는 코드 작성X

장고에서 제공하는 검증된 데이터 테스트 프레임워크 이용하기

(옵션) Code 파라미터로 에러 원인을 정확히 트래킹 가능

ValidationError(_('Invalid value'), code='invalid') 3

HTML FORM with POST method

데이터를 변경하는 모든 HTML form은 POST method이용 (단, 검색 form은 데이터 변경을 하지 않기때문에 GET 이용)

데이터를 변경하는 HTTP form은 꼭 CSRF 보안을 사용 (예외: API site제작시 / django-tastypie, django-rest-framework등 API 프레임워크는 자동으로 다 처리해 준다)

CSRF를 일일이 데코레이팅 하기 귀찮다면 CsrfViewMiddleware 를 사이트 전체에 적용하자

AJAX로 form 처리하기

4

AJAX로 Django Form 입력받기

AJAX도 당연히 CSRF보안을 이용해야한다. (예외처리 X)

AJAX request HTTP Header에 X-CSRFToken 설정

function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); if (cookie.substring(0, name.length + 1) == (name + cookieValue = decodeURIComponent(cookie.substring(name.length + break; }}} // 줄 수가 모자라... return cookieValue; } var csrftoken = getCookie('csrftoken'); // csrftoken을 얻었다! 5

function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } });

6

이렇게도 할 수 있어요. 단, {% csrf_token %}은 필수!

$("#id_of_form").submit(function(e) { e.preventDefault(); $.ajax({ url : window.location.href, type : "POST", // http method data : $(this).serialize(), // data success : function(json) { console.log(json); alert(json['message']); if (json['redirect']){ window.location.href = json['redirect']; } }, error : function(xhr,errmsg,err) { console.log(xhr.status + ": " + xhr.responseText); } }); }); 7

장고 폼에 추가적 인스턴스 속성

request.user 객체를 이용하자

user 속성 폼 이용하기

django-braces 모델폼 믹스인 이용하기 (request.user가 아닌 다른 것을 추가하는 경우)

http://2scoops.co/django-braces-user-form-kwargs-mixin

http://2scoops.co/django-braces-user-kwarg-model-form-mixin

8

장고 폼은 어떻게 유효성을 검사할까?

form.is_valid() 실행

form.full_clean()

to_python()

Validation error

form.clean()

(ModelForm) form.post_clean()

ModelForm 데이터를 모델 인스턴스로 설정

모델의 clean() method 호출

9

모델폼 데이터 -> 모델 인스턴스

form.save()하기 이전에는 모델 폼 데이터에 저장된 상태

form.save()이후에야 모델 인스턴스로 저장된다

폼이 정확하지 않은 경우 경우별로 상세한 제어가 가능하다

폼 데이터와 모델 인스턴스의 변화 각각 저장 가능

10

폼 에러 추가하기

Form.add_error() 이용

장고 1.7에서 추가된 기능

폼 메서드

errors.as_data : ValidationError인스턴스에 연결되는

Dict형 객체를 제공

errors.as_json : as_data를 json으로 반환

form.has_error : form의 에러코드가 None일 경우 True

form.non_�eld_errors : 특정 폼필드와 연결되지 않은 에러11

아직 위젯이 없는 필드

Django1.8 기준

django.contrib.postgres

ArrayField

HStoreField

위 두개는 HTML Field와 연결되는 위젯이 없다 (그렇지만 폼에 사용은 가능하다!)

12

장고 폼 패턴

13

장고 폼 관련 패키지

django-�oppyforms

django-crispy-forms

django-forms-bootstrap (works with django-�oppyforms)

14

간단한 모델 폼 & 기본 유효성 검사기

forms.ModelForm 을 이용하기

책에는 CBV로 설명되어있음

from django.forms import Form, ModelForm from .modles import IcecreamInfo class IcecreamInfoForm(forms.ModelForm): class Meta: model = IcecreamInfo # ModelForm에서는 model Meta가 있다 name = forms.CharField(max_length=20) class IceForm(forms.Form): temp = forms.IntegerField()

15

16