django

여러 개의 form을 만들어주는 formset

발전생 2020. 12. 19. 18:18

테이블이 다른 테이블과 관계가 없다면 

이처럼 modelformset_factory를 사용하면 된다.

 

formset = Authorformset(request.POST)

formset instance화는 이처럼 하면 된다.


foreign key 관계인 object에서 접근할 때는

이 코드는 'Mike Royko'가 Author인 Book들 전부를 데이터베이스에서 가져와서 formset에 넣는다.

 

BookFormSet = inlineformset_factory(Author, Book, fields=('title',))

첫번째 매개변수는 '다대일 관계'에서 '일'에 해당하는 클래스, 두번째 매개변수는 '다'에 해당하는 클래스이다.

Book은 foreignKey로 Author를 가지고 있다.

'트리' 자료 구조로 보면 부모, 자식 순이라고 할 수도 있다. (한 노드의 부모는 오직 하나)

 

formset = BookFormSet(instance=author)

이 코드는 조건에 해당하는 데이터를 모두 form에 채워놓는다.

하지만 Create에서는 form이 비어있기를 바란다. 그러면 매개변수를 추가해줘야 한다.

formset = BookFormSet(queryset=Book.objects.none(), instance=author)

이제는 form에 초기값이 채워져 있지 않다.

 

(추가)

이럴 바에 그냥 매개변수에 아무 것도 전달 안 해줘도 문제 없을 것 같아서 해봤다.

formset = BookFormSet()

잘 작동한다. 아직까지는 queryset=Book.objects.none() 을 어디에 사용해야 하는 지 모르겠다. 현재 따라하고 있는 유튜브 튜토리얼에서는 굳이 필요 없을 거 같다.

 


template에서 formset 사용법

form들이 한 줄에 다닥다닥 붙어있을 것이다.

form마다 다른 줄에 위치하기를 원한다면 for문이 끝나기 전에 <hr> 태그(개행을 일으키는 태그)를 추가하면 된다.

 


참고 자료

https://docs.djangoproject.com/en/3.1/topics/forms/modelforms/

 

Creating forms from models | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

https://www.youtube.com/watch?v=G-Rct7Na0UQ&list=PL-51WBLyFTg2vW-_6XBoUpE7vpmoR3ztO&index=13