본문 바로가기
Python/Django

Django form활용 유효성검사

by 좌우지간에 2025. 1. 14.

 

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() 작동 방식:
    1. 폼 객체를 생성할 때 전달된 데이터(예: request.POST)를 사용하여 폼을 채웁니다.
    2. 폼에 정의된 각 필드의 유효성 검사를 수행합니다. (예: 필수 필드, 데이터 형식, 길이 제한 등)
    3. 유효성 검사를 모두 통과하면 True를 반환하고, 폼 데이터를 정리하고 form.cleaned_data에 저장합니다.
    4. 하나라도 실패하면 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()는 폼 데이터의 유효성을 검사하고, 검사 결과를 바탕으로 다음 단계를 결정합니다.
  • 유효성 검사 실패 시, 오류 메시지를 포함한 폼 객체를 사용자에게 다시 보여주어 오류를 수정하도록 유도합니다.

이러한 과정을 통해 사용자가 제출한 데이터를 안전하게 처리하고, 오류 발생 시 사용자 친화적인 방식으로 대응할 수 있습니다.