[django] 유효성 검사를 하는 방법(is_valid메소드, errors 속성)

Juice-Han·2024년 2월 12일
0
post-custom-banner

django로 백엔드 공부를 하다보니 form을 사용하게 되었다. form의 유효성 검사 기능이 신기해서 정리해보려고 한다.

Form 유효성 검사

사용자가 입력한 내용에 대해 유효성 검사를 하는 건 여간 귀찮은 일이 아니다. django에선 model에 대한 form을 만들면 내부 메소드를 활용해 편하게 유효성 검사를 할 수 있다.

is_valid() 메소드

form의 가장 중요한 기능은 바로 유효성을 검사해주는 것이다.
is_valid()라는 메소드로 간단하게 검사할 수 있다.

'subject', 'message', 'sender'를 사용자로부터 입력받는다고 하자.
이때 사용자가 제대로된 형식에 갖춰서 데이터를 입력하면

data = {
	'subject' : 'hello',
    'message' : 'hi there',
    'sender' : 'juice@example.com',
}
form = ContactForm(data) # Form 클래스 생성자
form.is_valid()  # True

이렇게 form.is_valid()결과 값이 true가 나온다.

data = {
	'subject' : 'hello',
    'message' : 'hi there',
    'sender' :  'abcde.com', # 형식을 안 맞춤
}
form = ContactForm(data) # Form 클래스 생성자
form.is_valid()  # False

하지만 위의 코드와 같이 형식을 맞춰서 입력하지 않는다면
is_valid()의 결과 값이 False가 나온다.

model의 필드를 EmailField로 정의했다면 is_valid() 메소드가 알아서 이메일 형식을 검사해주는 것이다.

errors 속성

여기서 끝이 아니다.
form에는 errors라는 속성이 있는데, 이를 출력해보면

>>> form.errors
{'sender': ['Enter a valid email address.']}

이런 결과가 나온다.
어떤 속성에 무슨 문제가 있는지 알려주는 것이다.

템플릿 엔진으로 전달된 form에서 이 errors 속성을 활용한다면
사용자에게 에러표시를 더욱 편하게 할 수 있다.

활용 예시(bootstrap 5 사용)

{% if form.errors %}
	<div class="alert alert-danger" role="alert">
    {% for field in form %}
		{% if field.errors %} # field에 error 확인
    		<div>
            	<strong>{{ field.label }}</strong>
            	{{ field.errors }} # error 출력
        	</div>
    	{% endif %}
    {% endfor %}
	</div>
{% endif %}

표시되는 화면

유효성 검사 활용

이런식으로, 입력해야할 책 제목을 입력하지 않았다면 해당하는 필드에 맞게 에러표시를 할 수 있다.

error 출력 결과

error에 특별한 내용이 담길지 궁금해서 서버단에서 그 내용을 출력해봤다.

사용자가 책 제목(title)을 입력하지 않았을 때,

  • form['title'].errors 출력결과
<ul class="errorlist"><li>필수 항목입니다.</li></ul>

그냥 에러 내용을 html 코드로 리턴해준다. 만약 2개의 필드에 문제가 있다면?

  • form.errors 출력결과
<ul class="errorlist"><li>title<ul class="errorlist"><li>필수 항목입니다.</li></ul></li><li>content<ul class="errorlist"><li>필수 항목입니다.</li></ul></li></ul>

이렇게 출력되는 데 보기 힘들어서 정리해봤다.

<ul class="errorlist">
	<li>title
    	<ul class="errorlist">
			<li>필수 항목입니다.</li>
		</ul>
	</li>
	<li>content
		<ul class="errorlist">
    		<li>필수 항목입니다.</li>
    	</ul>
	</li>
</ul>

이런식으로 html코드를 리턴해준다.

django 유효성 검사 쓸만한가?

is_valid를 활용한 유효성 검사를 공부하다보니 이걸 활용하면 프론트엔드에서 유효성 검사를 하지 않아도 되기 때문에 프론트 개발이 편해지겠다라는 생각이 들었다.

그래서 쓸만하다고 생각했는데, 만약 프론트엔드에서 검사하지 않고 서버단에서 검사를 하게 된다면 그만큼 서버단에 비용이 발생하고, 유효성 검사 코드가 길어지기 때문에 메인 로직에 집중할 수 없을 것 같다는 생각이 들었다.

혼자 개발한다면 상관없는데, 협업을 한다면 프론트엔드와 백엔드가 이에관해 얘기를 나눌 필요성이 있을 것 같다.


참고자료

django 공식문서 - forms
https://docs.djangoproject.com/en/5.0/ref/forms/api/#django.forms.BoundField

점프 투 장고 - 폼
https://wikidocs.net/70855

profile
배우고 기록하고
post-custom-banner

0개의 댓글