Django - Form(함수형,클래스형) (PyCon Korea)
Web/Django

Django - Form(함수형,클래스형) (PyCon Korea)

뉴비뉴 2019. 8. 9.

Django Form

 

Django Form이란 Web의 Form 처리를 추상화하는 것이다.

 

전송을 누르게 되면 서버에서는 Form에 있는 데이터가 정상적이라면

성공 : Redirect

실패 : Error (필수항목을 입력하지 않았을 시)

 

1. 브라우저가 특정 페이지로 Request를 날린다.

 

2. GET or POST 

GET Form(self.object)

2.1 GET일 경우 "Unbound" Form 생성 (Unbound란 사용자가 전송한 데이터가 연결되어 있지 않다.)

2.2 업데이트의 경우 DB의 특정 레코드가 포함되어 Form이 만들어질 수 있다. (UpdateView)

2.3 만들어진 Form은 HTML로 랜더링 시켜 다시 브라우저로 전송

POST Form(request.POST)

3.1 Post 일 경우 사용자가 전송한 데이터를 가지고 Form을 생성한다.

3.2 업데이트의 경우 레코드(인스턴스)가 포함되어 Form이 생성된다.

3.3 만들어진 Form 을 가지고 Valid(검증)을 실행한다. Form.is_valid()

3.4 검증을 통과했다면 해당 데이터를 가지고 서버 로직으로 들어간 뒤 success_url 을 redirect 해준다.

Form.save() Model.save()

3.5 검증을 통과하지 못했다면 사용자가 입력한 데이터와 함께 검증과정에서 생긴 에러메시지를 Form 객체에 저장

Form.errors()

3.6 이 때 사용자가 보낸 데이터를 갖고 있기 때문에 Bound Form 이라고 한다.

1.x 버전

def clean_field1 이 실행되는 시점은 각 필드가 다 검증이 끝난 다음에 실행된다.

이미 cleaned_data에 검증된 데이터가 들어있다.

 

Model Form?

Form 과 Model은 비슷한 부분이 많다.

매핑 할 Model이 필요하다.

 

ModelForm의 예시

model = 사용할 model명

fields = model 안에 있는 칼럼들을 지정

fields = '__all__' = 모든 칼럼 사용

 

Template

 

함수형 뷰는 위와 같이 복잡한 것을 확인할 수 있다

GET , POST 요청을 받아서 서버 로직을 실행하고, 모델과 템플릿을 조합해서 인스턴스를 내보낸다.

 

하지만 FormView를 이용하여 위 코드를 간단하게 작성할 수 있다.

 

FormView

FormView와 ModelFormMixin을 상속받는다.

GenericView를 사용한다면 코드는 더 간단해진다.

 

[!] reverse_lazy는 reverse와 같은 기능인데 generic view에서 주로 사용한다. reverse는 사용불가

 

GenericView

ModelForm 을 만드는 것과 유사하다.

 

Formsets = a Set of Form (하나의 폼에 대한 집합) ex)

모델Form 의 경우 여러 인스턴스들의 집합

inline 형식으로 작성한 Formsets

모델링한 프로그램과 url 모델이 1:N 관계이기 때문에 inline 형식으로 사용할 수 있다.

parent : 1:N 관계이기 때문에 부모와 자식을 지정해주어야 한다.

extra=1 : 공백 form의 갯수

can_order=True, can_delete=True : 특정 인스턴스를 저장하는 순서나 삭제할 수 있게하는 기능을 사용 유무 결정

 

formset안에 담긴 정보는 context['formset'] = self.get_formset 으로 전달된다.

django-crispy-forms form 에 필요한 스타일링 코드를 백엔드 장고Form 에서 관리할 수 있게 해준다.

pip install 로 설치 후 사용할 수 있다.

 

 

참고 URL

https://www.youtube.com/watch?v=-zhv1RE16Cg&feature=youtu.be

https://www.slideshare.net/SeanKang19/django-form-78716437

 

Django form 폼나게 쓰기

https://www.pycon.kr/2017/program/159 Django 개발의 절반은 아마 Form 아닐까요? 저도 현업에서 Django를 Full stack으로 사용하면서 가장 많이 고민해던 Form에 대한 경험을 공유하기위해 발표를 준비했습니다. 25분이라는 짧은 시간에 …

www.slideshare.net

 

댓글

💲 추천 글