Django 프론트& 백엔드 개발

Django Form Method POST 처리 흐름 정리

Data Jun 2026. 1. 10. 22:38

Django에서 글 작성 기능을 구현할 때
Form → POST 요청 → DB 저장 → redirect
이 흐름이 자연스럽게 이어진다.

 

이번 글에서는 왜 이렇게 동작하는지를 중심으로 정리해본다.

 

1. form 태그에서 action을 명시하지 않으면?

<form method="post">
  {% csrf_token %}
  {{ form.as_ul }}
  <input type="submit" value="전송">
</form>

여기서 action 속성을 따로 지정하지 않았다.

 

이때 Django(정확히는 HTML)의 기본 동작은?

현재 요청된 URL로 다시 POST 요청을 보낸다

즉,

  • /posts/new/ 페이지에서 폼을 열었으면
  • submit 시에도 /posts/new/ 로 POST 요청이 들어온다

그래서 같은 view 함수에서 GET → 폼 보여주기 및 POST → 데이터 처리를 함께 처리할 수 있다.

 

2. {% csrf_token %} 은 왜 필요할까?

{% csrf_token %}

이 태그는 CSRF 공격을 방지하기 위한 보안 토큰을 폼에 삽입한다.

 

Django는 기본적으로:

  • POST 요청에 CSRF 토큰이 없으면
  • ❌ 요청 자체를 거부한다

그래서 POST 폼에는 거의 무조건 필요하다.

 

3. View에서 request.method 분기 처리

def post_create(request):
    if request.method == 'POST':
        title = request.POST['title']
        content = request.POST['content']
        new_post = Post(
            title = title,
            content = content
        )
        new_post.save() # DB적재 / migrationrs과 migrate는 테이블 설계 및 생성 담당.
        return redirect('post-detail', post_id=new_post.id) # urlname을 통한 redirect.
    else:
        post_form = PostForm()
        return render(request, 'posts/post_form.html', {'form': post_form})
  • GET 요청 → 폼 화면 렌더링
  • POST 요청 → 폼 데이터 처리

이 구조는 Django에서 정석 패턴이다.

 

4. POST 데이터는 어디서 오나?

title = request.POST['title']
content = request.POST['content']
  • request.POST 는
  • 폼에서 submit된 데이터 딕셔너리

즉, <input name="title"> 과 연결된다.

 

5. new_post.save() 는 무슨 역할일까?

new_post = Post(
    title=title,
    content=content
)
new_post.save()

여기서 중요한 포인트는 이것이다 👇

save()는 데이터(row)를 DB에 저장하는 역할만 한다

  • 테이블 구조 생성 ❌
  • 컬럼 설계 ❌
  • 데이터 INSERT / UPDATE만 수행

그럼 migrate를 안 했는데 왜 저장되나?

 

이미 과거에 migrate가 되어 있어 테이블이 존재하기 때문

  • makemigrations / migrate → 테이블 설계·생성
  • save() → 그 테이블에 데이터 적재

역할이 완전히 다르다.

 

6. redirect는 왜 쓰는가?

return redirect('post-detail', post_id=new_post.id)

redirect는 클라이언트에게 이렇게 말한다.

“POST 처리는 끝났고,
이제 이 URL로 다시 GET 요청을 보내라”

 

왜 바로 render 안 하고 redirect를 쓰나?

  • 새로고침 시 중복 저장 방지
  • URL 구조 명확
  • POST → GET 패턴(Post/Redirect/Get) 유지

실무에서 거의 항상 redirect를 사용한다.

 

7. 전체 흐름 요약

GET 요청 → 폼 보여줌
POST 요청 → 데이터 생성 + save()
redirect → 상세 페이지 이동

 

8. 정리하면

action 생략 → 현재 URL로 POST

csrf_token → POST 보안 필수 요소

request.method → GET / POST 분기

save() → 데이터 저장 (테이블 생성 아님)

redirect → POST 이후 화면 이동의 정석

Django에서 Form POST 처리는 같은 URL에서 요청을 받고,
save로 데이터를 저장한 뒤 redirect로 흐름을 마무리하는 것이 정석이다.