Django 폼 유효성 검사 완벽 정리
Django에서 폼을 통해 사용자 입력을 처리할 때, 데이터 유효성 검증은 필수적입니다. 이를 위해 Django는 request.method와 form.is_valid()라는 기능을 제공합니다.
1. HTTP 요청 구분: request.method
웹 페이지는 클라이언트(사용자의 브라우저)와 서버 간의 상호작용으로 이루어집니다. 이때 클라이언트가 서버에 특정 요청을 보낼 때 HTTP 메서드를 사용합니다. Django에서 가장 흔히 사용되는 메서드는 GET과 POST입니다.
- GET 요청:
- 주로 웹 페이지를 요청할 때 사용됩니다. (예: 처음 페이지 접속, 링크 클릭)
- GET 요청 시에는 폼 데이터가 서버로 전송되지 않습니다.
- POST 요청:
- 사용자가 폼에 데이터를 입력하고 제출할 때 사용됩니다.
- POST 요청 시에는 폼 데이터가 서버로 전송됩니다.
request.method는 현재 요청이 어떤 HTTP 메서드를 사용했는지 알려주는 속성입니다. 이를 통해 요청 종류에 따라 적절한 처리를 할 수 있습니다.
def my_view(request):
if request.method == 'POST':
# POST 요청 처리 (폼 데이터 처리)
pass
else:
# GET 요청 처리 (폼 초기화 등)
pass
2. 폼 유효성 검사: form.is_valid()
Django 폼은 폼에 입력된 데이터가 미리 정의된 규칙을 따르는지 확인하는 기능을 제공합니다. 이 검증 작업은 form.is_valid() 메서드를 통해 수행됩니다.
- form.is_valid() 작동 방식:
- 폼 객체를 생성할 때 전달된 데이터(예: request.POST)를 사용하여 폼을 채웁니다.
- 폼에 정의된 각 필드의 유효성 검사를 수행합니다. (예: 필수 필드, 데이터 형식, 길이 제한 등)
- 유효성 검사를 모두 통과하면 True를 반환하고, 폼 데이터를 정리하고 form.cleaned_data에 저장합니다.
- 하나라도 실패하면 False를 반환하고, 폼 객체에 오류 메시지를 저장합니다.
3. 폼 처리 흐름 예시 (post_new):
#views.py
def post_new(request):
if request.method == 'POST':
# POST 요청 처리: 데이터 제출
form = PostForm(request.POST) # 폼 객체 생성 및 데이터 바인딩
if form.is_valid():
# 유효성 검사 통과
post = form.save(commit=False) # 모델 인스턴스 생성(DB저장X)
post.author = request.user # 추가 필드 설정
post.save() # 데이터베이스 저장
return redirect('post_list') # 성공 후 목록 페이지로 이동
else:
# 유효성 검사 실패: 오류 메시지 포함된 폼 반환
return render(request, 'blog/post_new.html', {'form': form})
else:
# GET 요청 처리: 폼 초기화
form = PostForm()
return render(request, 'blog/post_new.html', {'form': form})
코드 설명:
- if request.method == 'POST':: HTTP 메서드가 POST인지 확인합니다. POST라면 폼 데이터 처리를 시작합니다.
- form = PostForm(request.POST): PostForm을 인스턴스화하고, 사용자가 제출한 폼 데이터(request.POST)를 폼에 바인딩합니다.
- if form.is_valid():: 폼 유효성 검사를 실행합니다.
- 유효성 검사 통과:
- form.save(commit=False): 폼 데이터로부터 모델 인스턴스를 생성하지만, 아직 데이터베이스에 저장하지는 않습니다.
- post.author = request.user: 추가 필드 값을 설정합니다. (request.user는 현재 로그인한 사용자 정보)
- post.save(): 모델 인스턴스를 데이터베이스에 저장합니다.
- redirect('post_list'): 성공적으로 게시물을 저장한 후 게시물 목록 페이지로 리디렉션합니다.
- 유효성 검사 실패:
- 오류 메시지가 포함된 form 객체를 다시 템플릿으로 전달합니다. 사용자에게 오류 메시지를 표시하고, 수정하도록 유도합니다.
- 유효성 검사 통과:
- else:: POST 요청이 아닌 경우 (즉, 처음으로 폼 페이지를 요청한 경우)
- form = PostForm(): 빈 폼 객체를 생성합니다.
- 생성된 빈 폼 객체를 템플릿에 전달하여 빈 폼을 표시합니다.
핵심 요약:
- request.method는 HTTP 요청 종류를 구분하여 폼 처리 분기점을 만듭니다.
- form.is_valid()는 폼 데이터의 유효성을 검사하고, 검사 결과를 바탕으로 다음 단계를 결정합니다.
- 유효성 검사 실패 시, 오류 메시지를 포함한 폼 객체를 사용자에게 다시 보여주어 오류를 수정하도록 유도합니다.
이러한 과정을 통해 사용자가 제출한 데이터를 안전하게 처리하고, 오류 발생 시 사용자 친화적인 방식으로 대응할 수 있습니다.
'Python > Django' 카테고리의 다른 글
| 웹보안을 위해 쿠키, 세션, 해시 그리고 JWT (Django 관점) (1) | 2025.01.17 |
|---|---|
| DRF학습전 API, RESTful API 미리보기 (1) | 2025.01.16 |
| Django 객체 추상화(모델 클래스 상속) (1) | 2025.01.13 |
| Django RDBMS 코드예시 (0) | 2025.01.10 |
| 관계형 데이터베이스 보충 (3) | 2025.01.09 |