일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 해시맵
- 명령어
- spring
- spring boot
- Java
- bfs
- HashMap
- 인텔리제이
- 문자열
- Linux
- dfs
- 스프링
- 프로그래머스
- 자료구조
- 개발자
- docker
- 주니어
- 스프링 부트
- 이직
- IntelliJ
- 코딩테스트
- 해결
- 도커
- 구름LEVEL
- 백엔드
- 스프링부트
- 스타트업
- 구현
- 배열
- HTTP
- Today
- Total
마이의 개발 블로그
[Django] 빈 폼, 미완성 폼 출력 컨트롤하기 (empty_permitted) 본문
장고 프레임워크에서는 Formset을 활용하여 여러 개의 폼을 저장하고 관리할 수 있는데, 뷰에서 Formset을 생성하여 템플릿으로 보내면, 기본적으로 비어있는 폼 한 세트가 포함된다.
매번 한 개 이상의 폼이 저장되어야 하는 페이지라면 상관없으나, 상황에 따라 폼을 렌더링하지 않도록 컨트롤 할 수도 있어야 하는데 이때 폼의 empty_permitted 속성을 활용하여 문제를 해결할 수 있다(공식 문서와 검색을 통해 발견한 내용들은 대체로 empty_permitted를 폼 자체에 선언하여 사용하는 방식이였으나, 나의 경우에는 폼에 필수 입력값들이 있어 이를 장고 validator를 통해 validate하는 과정을 무조건 거쳐야 했고 필요에 따라 빈 폼을 렌더링하기도 해야했기에 필요에 따라 빈 폼을 렌더링 할 지 말지를 컨트롤해야했다).
empty_permitted는 이름 그대로 빈 값을 폼에 허용한다는 의미를 갖는데, boolean값으로 저장되며 폼의 생성과 생성 이후 단계 모두에서 지정될 수 있다. 나는 뷰에서 이 값을 컨트롤하여 내 상황에 맞게 사용했다.
먼저, 폼에서는 기본값을 따로 지정하지 않은 채로 템플릿에서 아래와 같이 폼을 렌더링했다.
in template
{% for form in formset %}
{% if form.empty_permitted != True %}
{# 폼 렌더 #}
{% endif %}
{% endfor %}
이렇게 하면 입력과 validation이 끝난 폼셋들만 렌더링 할 수 있게 되고 주로 수정, 확인 기능이 필요한 페이지에서 이런 방식으로 정보를 출력했다.
그러나 임시저장 기능을 구현할 때는 미완성의 폼을 전달하고 출력할 수 있어야 했는데, 만약 미완성의 폼이 필수 컬럼들이 입력이 되지 않은 채로 전달되면 empty_permitted 속성이 True인 상태로 남아있어 템플릿에서 출력을 할 수 없었다. 이 경우에는 아래와 같이 뷰에서 해당 컬럼값을 변경하여 처리했다.
in views
for form in formset:
form.empty_permitted = False
이렇게 하면 사용자가 미완성인 채로 제출하여 필수값 validation에서 걸린 폼들도 위와 같은 템플릿에서 그대로 출력할 수 있게 된다.
'개발지식 > Django' 카테고리의 다른 글
[Python] 로그 파일 핸들러 2개(TimedRotatingFileHandler, RotatingFileHandler) 합쳐서 사용하는 방법 (0) | 2024.03.14 |
---|---|
[Django] Auth0에서 이메일 인증 여부(email_verified) 체크하기 (0) | 2023.01.02 |
[Django] import-export 모듈의 활용(관리자에 엑셀 업/다운로드 기능 설치) (0) | 2023.01.02 |
[Django] 뷰에서 폼의 모든 필드를 disabled로 변경하기 (0) | 2023.01.02 |