장고에서 폼의 동작 과정은
Form 클래스에서 폼을 정의하고, View에서 사용하여
Template엔진에 의해 html로 렌더링된다.
폼 종류
- 일반 폼- Form클래스를 상속받아 정의
- 모델 폼- ModelForm클래스를 상속받아 정의.폼 필드 구성을 DB 모델 정의 기반으로 폼을 정의하는경우에 사용한다.
- 폼셋 - 일반 폼을 여러개 묶어서 한번에 보여준다. formset_factory()함수 이용
- 모델 폼셋- DB에 기초해서 여러 폼 묶은것. modelformset_factory()이용
- 인라인 폼셋- 두 모델간 관계가 1:N일때 N모델에 기초해서 모델을 여러개 묶은 모델폼이다. Inlineformset_factory()이용.
폼 객체를 만들때 폼생성 클래스에 인자 값이 들어가면 DB와 연결되는 바운드폼,
인자가 없다면 DB와 연결되지않은 빈값 .언바운드폼이 된다.
그리고 폼을 출력하는 방식이 다양하다
이제 처음에 말한 폼 종류별 정의 방식에 대해 알아보자.
작업이 매우 간단하다.
이 방법 뿐 아니라 modelform_factory() 메소드방식을 이용할수 있다.
CreateView와 UpdateView는 폼 작성기능을 갖고있어야 해서, ModelForm기능이 내장되어있다. 따라서 간단히 작성시 fields='__all__'을 이용할수있다.
보통 formset_factory() 메소드를 이용한다.
하나의 폼을 임포트해서 formset_factory()와 사용해줬다.
modelformset_factory()를 이용한다. 이때 내부적으로 modelform_factory()와 formset_factory()를 호출한다.
1:N관계의 테이블에서 폼을 작성할경우 인라인 폼셋을 이용해야한다.
이경우에 BaseInlineFormSet클래스 상속과 inlineformset_factory() 메소드 두가지 이용가능한데
모통 factory메소드를 이용한다.일반 album모델 안에 작성한다.
파일 업로드 폼을 정의할때 FileField와 ImageField 필드를 통해 업로드가 이뤄진다.
또, 주의해야할점은 form의 인코딩 요소를 multipart로 지정해야하고,
폼에 데이터를 바인딩할때 폼 데이터뿐 아니라 파일 데이터도 같이 바인딩해야한다.