Two Scoops of Django
장고 폼의 기초 & 폼 패턴들
이준범 (Beomi / [email protected])
2016. 09. 26.
with 장고 투스쿱 읽기모임
1
장고 폼 사용하기
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
장고 폼 관련 패키지
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
Top Related