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로 흐름을 마무리하는 것이 정석이다.
'Django 프론트& 백엔드 개발' 카테고리의 다른 글
| Model 단계에서의 유효성 검사 (1) | 2026.01.11 |
|---|---|
| ModelForm이란? (0) | 2026.01.11 |
| Django Form으로 입력 폼 빠르게 만들기 (0) | 2026.01.10 |
| URL Name을 활용한 템플릿 태그 사용법 (0) | 2026.01.10 |
| [트러블슈팅] Django URL 404 에러를 통해 배운 것 - URL Converter 공백 처리 (0) | 2026.01.10 |