https://www.pycon.kr/2017/program/159
Django 개발의 절반은 아마 Form 아닐까요?
저도 현업에서 Django를 Full stack으로 사용하면서 가장 많이 고민해던 Form에 대한 경험을 공유하기위해 발표를 준비했습니다.
25분이라는 짧은 시간에 모두 담아내기는 어렵기 때문에, 주로 기본적인 Django Form의 동작 원리와 구현 Internal에 많은 초점이 맞춰져 있습니다.
class Form:
fields =[]
data = {}
initial = {}
cleaned_data, errors = {}, []
def __init__(self, data=None):
self.is_bound = data is not None
def is_valid(self):
self.clean()
return self.is_bound and not self.errors
def clean(self):
for name, field in self.fields:
try:
value = field.clean()
except ValidationError as error:
self.errors.append(error)
else:
self.cleaned_data[name] = value
https://github.com/grepsean/pyconkr-2017-django-form/blob/master/demo/form_pseudo.py#L29
Form의 pseudo-code
19.
class Form:
fields =[]
data = {}
initial = {}
cleaned_data, errors = {}, []
def __init__(self, data=None):
self.is_bound = data is not None
def is_valid(self):
self.clean()
return self.is_bound and not self.errors
def clean(self):
for name, field in self.fields:
try:
value = field.clean()
except ValidationError as error:
self.errors.append(error)
else:
self.cleaned_data[name] = value
https://github.com/grepsean/pyconkr-2017-django-form/blob/master/demo/form_pseudo.py#L29
Form의 pseudo-code
20.
https://github.com/grepsean/pyconkr-2017-django-form/blob/master/demo/form_pseudo.py#L7
class Field:
widget =TextInput
validators = []
def __init__(self, validators):
self.validators = validators
def clean(self, value):
self.run_validators(value)
return value
def run_validators(self, value):
errors = []
for validator in self.validators:
try:
validator(value)
except ValidationError as error:
errors.append(error)
if errors:
raise ValidationError(errors)
Field의 pseudo-code
21.
https://github.com/grepsean/pyconkr-2017-django-form/blob/master/demo/form_pseudo.py#L7
class Field:
widget =TextInput
validators = []
def __init__(self, validators):
self.validators = validators
def clean(self, value):
self.run_validators(value)
return value
def run_validators(self, value):
errors = []
for validator in self.validators:
try:
validator(value)
except ValidationError as error:
errors.append(error)
if errors:
raise ValidationError(errors)
Field의 유효성 검증