마이의 개발 블로그

[Django] 빈 폼, 미완성 폼 출력 컨트롤하기 (empty_permitted) 본문

개발지식/Django

[Django] 빈 폼, 미완성 폼 출력 컨트롤하기 (empty_permitted)

개발자마이 2023. 1. 2. 11:57
반응형

장고 프레임워크에서는 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에서 걸린 폼들도 위와 같은 템플릿에서 그대로 출력할 수 있게 된다.

반응형
Comments