장고 is_valid() 역할 – validation failed for field 디버깅

Template의 form에서 데이터를 분명히 전송 받은 것 같은데 view에서 요청이 제대로 안 들어 가는 것 같아서 form에 들어간 데이터의 문제인가 해서 “장고 is_valid() 역할”에 대해서 공부해 보았습니다.

장고 is_valid() 역할

  1. 필수 항목: 제출된 데이터에 필수 항목이 모두 포함되어 있는지 확인합니다.
  2. 데이터 유형: 제출된 데이터가 양식의 필드 정의에 정의된 예상 데이터 유형과 일치하는지 확인합니다.
  3. 필드별 유효성 검사: 최대 길이 또는 사용자 정의 유효성 검사기와 같이 개별 양식 필드에 대해 지정된 추가 유효성 검사 논리를 적용합니다.
  4. form 전체 유효성 검사: form의 ‘clean()’ 메서드에 정의된 양식 전체 유효성 검사 논리를 실행하여 여러 필드가 포함된 복잡한 유효성 검사를 허용합니다.

제출된 데이터가 모든 유효성 검사를 통과하면 'is_valid()'True를 반환하여 양식 데이터가 유효함을 나타냅니다.

그렇지 않으면 ‘False’를 반환하여 하나 이상의 유효성 검사 오류가 발생했음을 나타냅니다.

개발자는 일반적으로 ‘is_valid()‘ 메서드를 조건문과 함께 사용하여 데이터베이스에 유효한 데이터를 저장하거나 사용자가 수정할 수 있도록 오류 메시지와 함께 form을 렌더링하는 등 유효한 form 제출과 유효하지 않은 form 제출을 적절하게 처리합니다.

아래 코드를 통해서 유효하지 않은 form에 대한 오류 메시지를 출력할 수 있습니다.

 if forms.is_valid():
		board = forms.save()
else:
	# Form data is invalid, handle errors
	for field_name, error_messages in forms.errors.items():
		# Iterate over each field and its associated error messages
		print(f"Validation failed for field '{field_name}': {', '.join(error_messages)}")

위의 코드로 유효하지 않은 form이 무엇인지 확인해보았습니다.

is_valid()의 False 결과

뭐지… 다 유효성 fail 발생했네…? 왜 그러지?

확인해보니 form 태그가 {{ form.as_p }} 보다 하위에 존재한 걸 눈치챘습니다.. -> form 요청이 넘어오지 않음

참 멍청한 실수인데… 찾는데 꽤나 걸렸네요…허허

<div class="detail">
    {{ forms.as_p }}
    <br><br>
    <a href= {% url "boards:index" %}>
        <button type="submit">메인으로</button>
    </a>
    <a href= {% url "boards:detail" pk %}>
        <button type="submit">이전으로</button>
    </a>
    <form action={% url "boards:update" pk %} method="POST">
        {% csrf_token %}
        <button type="submit">수정완료</button>
    </form>
</div>

문제를 해결한 코드

<div class="detail">
    <form action={% url "boards:update" pk %} method="POST">
        {{ forms.as_p }}
        <br><br>
        <a href= {% url "boards:index" %}>
            <button type="submit">메인으로</button>
        </a>
        <a href= {% url "boards:detail" pk %}>
            <button type="submit">이전으로</button>
        </a>
        {% csrf_token %}
        <button type="submit">수정완료</button>
    </form>
</div>

참고하면 좋은 글

공식 document : Form and field validation | Django documentation | Django (djangoproject.com)

Leave a Comment

목차