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 이라고 한다.


def clean_field1 이 실행되는 시점은 각 필드가 다 검증이 끝난 다음에 실행된다.
이미 cleaned_data에 검증된 데이터가 들어있다.
Model Form?
Form 과 Model은 비슷한 부분이 많다.
매핑 할 Model이 필요하다.

model = 사용할 model명
fields = model 안에 있는 칼럼들을 지정
fields = '__all__' = 모든 칼럼 사용


GET , POST 요청을 받아서 서버 로직을 실행하고, 모델과 템플릿을 조합해서 인스턴스를 내보낸다.
하지만 FormView를 이용하여 위 코드를 간단하게 작성할 수 있다.

FormView와 ModelFormMixin을 상속받는다.
GenericView를 사용한다면 코드는 더 간단해진다.
[!] reverse_lazy는 reverse와 같은 기능인데 generic view에서 주로 사용한다. reverse는 사용불가

ModelForm 을 만드는 것과 유사하다.
Formsets = a Set of Form (하나의 폼에 대한 집합) ex)
모델Form 의 경우 여러 인스턴스들의 집합

모델링한 프로그램과 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
'Web > Django' 카테고리의 다른 글
| Django - 소셜 로그인 추가하기(allauth, naver) (0) | 2019.08.17 |
|---|---|
| Django - Form 커스터마이징(CreateView, UpdateView) (0) | 2019.08.14 |
| Django - models.imageField, FileFieild url 응용 (0) | 2019.08.09 |
| Django - 검색기능 구현 (2) | 2019.08.07 |
| Django - static 파일지정 (0) | 2019.08.05 |
댓글