220124 TIL

CoderS·2022년 1월 24일
0

TIL DAY 163

오늘 배운 일

✔️ Django 웹 개발

1. Field 인자로 유효성 검증하기

이번에는 필드의 유효성 검증을 할 수 있는 방법에 대해 알아보겠다.

크게 두 가지 방법으로 나눠지는데...

  1. 필드를 정의할 때 필요한 옵션 인자로 주는 방법
  2. 따로 validator 를 추가하는 방법

두 가지 방법을 사용해서 필드를 잘 정의하면 유효성 검사에 많은 부분을 처리할 수 있다.

이번에는 둘 중에 django 의 내장 필드 옵션을 이용해서 유효성 검증을하는 방법에 대해 알아보겠다.

필드라고 하면 우리에게 두 가지가 존재한다.

  • 모델을 정의할 때 사용하는 모델 필드 (Model Field)
  • 폼을 정의할 때 사용하는 폼 필드 (Form Field)

출처 : 코드잇

이 두가지 모두 동일하게 유효성 검사를 할 수 있고 모델 품을 사용하고 있으므로 모델의 유효성 검사를 추가하면 된다.

그러면 자동으로 모델을 기반으로 폼이 생성되므로 유효성 검증이 한 번에 이루어지게 된다.

models.py 에서 각각의 필드마다 유효성 검증을 추가해보면 되는데...

models.py

먼저 해볼 것은 django 에서 기본적으로 제공하는 옵션 인자를 이용하는 방법이다.

우리가 구현해야 하는 유효성 검증 중에 제목과 내용은 폼을 빈간으로 둘 수 없고 반드시 내용을 작성하도록 해야 하는 항목이다.

출처 : 코드잇

위의 코드중에 빨간박스안에 인자로 blank 를 False 를 주면 되는데...

이 때 blank 옵션은 모든 필드에 기본적으로 있는 옵션 인자로 폼의 빈간을 허용할지를 결정하는 것이다.

기본값은 False 로 빈칸을 허용하지 않고 모든 필드를 입력하도록 되어 있다.

그러니까 우리같은 경우에는 따로 설정해 줄 필요가 없다.

만약에 빈칸 입력을 사용하고 싶은 경우에는, blank 옵션을 True 로 변경하면 된다.

이러한 기본 옵션 중에 null 옵션도 존재하는데, null 은 데이터의 빈 값을 null 로 저장하는 것을 허용할지 여부를 결정하는 것이다.

null 이 True 라면 빈 값이 넘어왔을 때 null 로 변환해서 데이터베이스에 저장한다는 것이다.

이러한 blank 옵션을 문자열 기반의 필드에 사용할 때 주의를 해야 하는데 비어있다는 뜻을 나타내는 것이 빈 값과 null 두 가지가 있기 때문이다.

출처 : 코드잇

하나의 시스템에서 비어있는 것을 의미하는 값은 하나가 되어야 하는데, django 표준에서는 문자열 기반 필드에서 빈 문자열을 비어있는 값으로 하도록 권장한다.

그리하여 문자열 기반 필드에서는 blank 옵션을 True 로 하면 빈 문자열이 저장되도록 한다.

따라서 자연스럽게 null 을 True 로 하는 옵션은 문자열 기반 필드에서는 권장되지 않는다.

다음으로 모든 제목은 중복되어야 하지 않는다고 말했는데 이 때 사용할 수 있는 옵션은 unique 옵션이 있다.

unique 옵션은 기본적으로 False 로 설정되어 있는데 True 로 설정할 경우 데이터베이스에는 같은 형식의 데이터는 저장할 수 없게 된다.

만약 같은 형식의 데이터를 저장할려면 유효하지 않다는 에러를 내게 될 것이다.

그러면 한 번 우리 프로젝트에 적용해보겠다.

costory 프로젝트로 가서 posts 앱의 models.py 로 가서 다음과 같이 작성한다.

models.py

이렇게 뒤에다가 unique = True 를 사용하면, 그러면 같은 제목의 데이터는 저장하지 못한다.

모델을 다 작성했으니까 views.py 로 가서...

views.py

여기 method 가 POST 일 때, 즉 유저로부터 데이터를 입력받으면 바로 데이터를 데이터베이스에 저장하도록 되어 있다.

이렇게 데이터의 유효성 검사를 하지 않고 데이터를 사용하고 저장하는 것은 위험한 방법이다.

위의 코드를 조금 수정해서 유효성 검정을 해서 데이터가 유효성 검사를 통과하면 데이터베이스에 저장을 하고 아니라면 다시 입력하도록 해주겠다.

다음과 같이 코드를 작성해준다!

is_valid 에 대해 설명하자면 post_form 의 데이터가 유효한지 체크해 주는 함수이다.

그리고 밑에 코드를 참고해준다.

다음으로 데이터가 유효하지 않을 때도 적어준다.

else 문을 사용해준다.

자 이렇게 해주면 데이터가 유효하지 않을 때 유저로부터 데이트를 다시 입력받게 되는데 이 때 지금 데이터가 있는 폼을 다시 전달해서 입력을 받게 된다.

이 때 폼에는 유효성 검증을 통과하지 못했기 때문에 발생한 에러 메시지가 함께 전달되게 된다.

그리고 만약 코드 아래처럼 이런 식으로 코드를 작성한다면 기존에 있는 데이터가 다 날아가고 새로 작성해야 하는 폼이 된다.

그러면 유저가 다시 처음부터 데이터를 입력해야 하기 때문에 좋은 방식이 아니다.

그래서 지금 폼에 가지고 있는 데이터를 그대로 다시 템플릿으로 전달해 주기 위해서 이런 식으로 코드를 작성해주었다.

근데 지금 보면 유효하지 않을 때와 GET 방식으로 요청이 들어왔을 때 코드가 중복된다.

그리하여 위의 있는 else 코드를 삭제해준다.

자 코드를 보면 POST 방식으로 데이터가 전달되면 유효성 검사를 하고 유효성 검사를 통과하면 데이터베이스에 데이터를 저장하게 된다.

그 다음에는 디테일 페이지로 이어진다.

그런데 만약에 데이터가 유효하지 않다면 바로 if 문이 걸리지 않으니까

바로 return 문으로 가서 이미 작성했던 데이터 폼을 그대로 다시 돌려준다.

만약 GET 방식으로 오면...

이런 식으로 비어있는 폼을 만들고 템플릿으로 넘겨주게 된다.

자 그럼 이제 서버를 실행해서 확인해보자!

http://127.0.0.1:8000/posts/

우선 posts 로 가서 똑같은 이름으로 글을 하나 써보겠다.

그리고 http://127.0.0.1:8000/posts/new 로 가서...

그리하여 중복되는 제목을 작성해준다.

예 )

전송버튼을 누르면 이런 식으로 에러 메시지가 나타난다.

만약 위의 있는 에러 메시지를 바꾸고 싶으면 모델로 가서 옵션 인자로 에러 메시지를 적어서 메시지를 바꿔준다.

models.py 로 가서...

다음과 같이 코드를 작성해준다.

사전형 형태로 에러 메시지를 넣어주는데 이 unique 라는 에러가 발생하면 에러가 메시지가 나타난다.

이렇게 키 값으로 지금처럼 django 내장 옵션 인자를 에러코드로 입력할 수 있고 나중에 배울 커스텀 에러 코드를 입력할 수도 있다.

그러면 잘 작동하는지 확인해보자!

웹 페이지로 돌아가서 다시 전송 버튼을 누르면...

이번에는 변경된 에러 메시지가 잘 출력되어있다.

끝으로 :

  • 오늘은 모델에서 필드의 옵션을 이용해서 유효성 검사를 해보았다.
  • 생각보다 알아야할게 많아서 다시 한 번 공부해야겠다.
profile
하루를 의미있게 살자!

0개의 댓글