사전안에 있는 values 는 여러분들이 검증하려고 하는 데이터 입니다. 이들은 보통 문자열로 되어 있지만, 문자열이여만 하는 요구 조건은 없습니다. 전달될 데이터 타입은 필드 마다 다를수 있습니다.
is_bound
만약 여러분들이 form 인스턴스가 bound 인지 unbound 인지 실행시에 구분하고 싶다면, form 의 is_bound 속성의 값을 확인 하면 됩니다. True 혹은 False 를 반환합니다.
shell 에서 확인해보면,
1 2 3 4 5 6 7
In [3]: from forms_more_on_fields.forms import ContactForm In [4]: f = ContactForm() In [5]: f.is_bound Out[5]: False In [6]: f = ContactForm({'subject': 'hello'}) In [7]: f.is_bound Out[7]: True
폼 인스턴스에 데이터가 들어가면, is_bound 를 호출했을때, True 를 반환하고
폼 인스턴스에 데이터가 들어가지 않은 unbound 폼에 is_bound 를 호출하면, False 를 반환합니다
비어 있는 사전을 전달할 경우, 비어 있는 데이터를 가진 bound form 이 됩니다.
1 2 3 4
In [8]: f = ContactForm({}) # 비어있는 사전 전달
In [9]: f.is_bound Out[9]: True
Bound Form 인스턴스를 가지고 있고, 어떻게든 데이터를 바꾸고 싶거나 혹은 unbound form 을 어떠한 데이터를 가지게 하고 싶다면, 또다른 Form 인스턴스를 생성하면 됩니다.
Form instance 안에 데이터를 변경하는 길은 없습니다. 한번 Form 인스턴스가 생성이 되면, 데이터를 가지고 있던 없던, 데이터는 변경이 불가능 합니다!
만약 여러분들이 수동으로 폼을 템플릿안에서 레이아웃을 잡는 작업을 하고 있다면, Django 의 기본 폼 레이아웃과는 반대되게, <input type="hidden"> 을 사용하여, 숨김처리가 되지 않은 필드들과 다르게 사용할수 있습니다.
예를들면, 숨겨진 필드들은 아무것도 출력하지 않기 때문에, 에러 메시지들을 해당 필드 옆에 출력 한다는것은 사용자들에게 혼란을 일으킬수 있을것입니다. 따라서, 이런 필드들의 에러들은 다른 방식으로 다루어 져야 합니다.
Django 는 숨겨진 필드와 노출된 필드들을 따로 반복할수 있게 해줍니다.
바로, hidden_fields() 와 visible_fields()
아래 예시를 참고합니다.
1 2 3 4 5 6 7 8 9 10 11
{# Include the hidden fields #} {% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %} {# Include the visible fields #} {% for field in form.visible_fields %} <divclass="fieldWrapper"> {{ field.errors }} {{ field.label_tag }}{{ field }} </div> {% endfor %}
위의 예시는, 숨겨진 필드들 안에 있는 어떤 에러도 다루지 않습니다. 보통은, 숨겨진 필드안에 있는 에러는 폼 변조를 의미할수 있습니다. 보통 폼 동작은 폼을 바꾸지 않습니다.
만약 여러분들이 각 폼 필드들을 위해 같은 HTML 테그들을 사용하고 있다면, 반복되는 코드들을 줄일수 있습니다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# 반복문을 사용하여 반복되는 코드를 줄일수 있습니다 # {% for %}
# 예시
{% for field in form %} <divclass="fieldwrapper"> {{ field.errors }} {{ field.lable_tag }}{{ field }} {% if field.help_text %} <pclass="help"> {{ field.help_text|safe }} </p> {% endif %} </div>
# {{ field.label_tag }} # 필드의 label 이 적절한 HTML <label> 태그로 감싸집니다. 이는 form 의 label_suffix 를 포함합니다. 예를들면, labe_suffix 의 기본값은 콜론입니다. <lablefor="id_email">Email address:</lable>
# {{ field.id_for_label }} # 이 필드를 위해 사용될 ID (위 예시에서는 id_email). # 만약 여러분들이 label 을 수동으로 만들고 있다면, 이것을 label_tag 대신에 사용할수 있습니다 # 이것또한 유용하게 사용될수 있습니다. # 예를들면, 여러분들이 인라인 JavaScript 를 가지고 있고, 필드의 ID 를 하드코딩 하는것을 피하고 # 싶을때처럼 말이죠
# {{ field.html_name }} # 인풋 요소의 이름 필드에 사용될 필드의 이름, 설정 되어 있다면, 폼의 접두사를 고려합니다
# {{ field.help_text }} # 필드와 관련된 hep text
# {{ field.errors }} # 필드에 해당하는 유효성 혹은 검증 에러를 가지고 있는 <ulclass-"errorlist">를 출력합니다 # 에러의 모습을 {% for error in field.errors %} 반복문을 사용하여, 커스터마이즈 할수 있습니다. # 이 경우에는, 반복문안에 각 객체들은 에러 메시지를 포함하고 있는 문자열이 됩니다. # {{ field.is_hidden }} # 만약 필드가 숨겨진 필드라면 True 를 반환하고, 숨겨져 잇지 않다면 False 를 반환합니다 # 이것은 특출나게 템플릿 변수로써 유용하지 않습니다. 하지만 아래 예시같이 조건적인 테스트에서는 # 유용할수 있습니다 {% if field.is_hidden %} {% endif %} # {{ field.field }} # 폼 클래스로부터 필드 인스턴스로 BoundField 로 감싸집니다. # Field 속성들을 엑세스하기 위해 사용합니다. 예) {{char_field.field.max_length}}