Django의 MTV(Model-Template-View) 패턴은
CRUD(Create, Read, Update, Delete) 작업을 명확하게 구현할 수 있도록 구조화되어 있음
C(Create) : 사용자 입력 폼과 데이터 저장 로직을 작성, 새로운 데이터를 데이터베이스에 저장
R(Read) : 저장된 데이터를 데이터베이스에서 조회, 템플릿에 렌더링하여 사용자에게 표시
연계 : Create에서 저장된 데이터를 Read에서 즉시 확인할 수 있도록 설계
모델 설계
앱(articles)내의 models.py - 데이터 구조 정의
View 정의
앱(articles)내의 views.py
Read(articles) : views.py에서 Model에 접근해 data를 가져와 Template으로 전달
Create(new, create) :
new view에서 새 글 작성 화면 제공, 새로운 데이터 작성 ->
create view에서 데이터 넘겨받기 ->
넘겨받은 데이터로 새로운 데이터 처리 및 저장
템플릿 작성
Template에서 넘어온 context 보여주기(전달받은 데이터 출력)
=> View에서 Templates을 랜더링해서 반환
• id : 각 레코드 고유 값
• title: 제목
• content: 내용
• created_at: 생성 시간 (자동 기록)
• updated_at: 업데이트 시간 (자동 기록)
클라이언트에서 서버에 데이터를 전송하여 저장
urls.py에 path 추가 - views.articles, views.new, views.create
path("", views.articles, name="articles"), # Read
path("new/", views.new, name="new"), # Create - 폼 화면
path("create/", views.create, name="create"), # Create - 데이터 처리
앱(articles)내의 urls.py
앱(articles)내의 templates/new.html(method = "GET")
앱(articles)내의 new.html(method = "POST")
7번 line에 {% csrf_token %}코드 넣어줌
method를 POST방식으로 지정해준 경우, views.py에서도 POST방식으로 요청 변경
*CSRF 토큰
서버가 요청의 유효성을 확인하기 위해 생성하는 고유한 임의 문자열
사용자가 의도하지 않은 요청(악성 사이트에서 유도된 요청 등)을 방지
Django에서 적용 코드
{% csrf_token %}
- GET은 데이터를 URL에 담아 보내고, POST는 BODY에 담아 보냄
- POST 요청은 CSRF 방지를 위해 CSRF 토큰이 필요
- POST 방식은 데이터 전송량의 한계가 없고, 보안적으로 더 안전
*GET vs. POST
GET
- 데이터를 URL에 포함하여 서버로 전송
- 일반적으로 데이터를 조회하는 데 사용
- URL에 노출되므로 민감한 데이터에는 부적합
- 데이터 전송량 제한 존재
- DB 변경 없음
POST
- 데이터를 HTTP 요청의 본문에 포함하여 서버로 전송
- 데이터 생성, 수정, 삭제와 같이 서버 상태를 변경하는 요청에 사용
- Django에서는 CSRF Token을 통해 보안 강화
- 데이터 크기 제한 없음
- DB 변경 발생
작성완료 화면
앱(articles)내의 templates/create.html
templates에서 Id를 받아오지 않았을 때
id 받아오고 POST방식으로 변경 후
created_at(생성일)기준 내림차순해서 데이터를 들고와 렌더링
articles = Article.objects.all().order_by("-pk") # 최신순 정렬
*Django에서 pk와 id는 기본적으로 동일한 값을 참조하지만, 사용 목적과 표현 방식에 약간의 차이가 있음
id
• Django 모델에서 id: 기본적으로 자동생성되는 Primary Key 필드의 이름
• 정수형 필드(AutoField)로 생성되며, 각 레코드의 고유 값을 나타냄
→ 특별히 모델에서 primary_key를 지정하지 않으면, Django는 id라는 필드를 Primary Key로 생성
class MyModel(models.Model):
name = models.CharField(max_length=100)
위 모델에서는 'id'가 자동으로 생성되어 Primary Key 역할을 함
pk
• pk는 Django에서 Primary Key 필드를 참조하는 추상적인 속성
• 모델에서 Primary Key로 설정된 필드를 가리키는 별칭(alias) 역할
• pk는 Primary Key 필드의 이름이 꼭 id가 아니더라도 해당 필드를 참조할 수 있음
class MyModel(models.Model):
custom_id = models.CharField(max_length=50, primary_key=True)
name = models.CharField(max_length=100)
이 경우:
pk == custom_id
id는 자동으로 생성되지 않음
id | pk | |
역할 | 기본 Primary Key 이름 | Primary Key 필드를 추상적으로 참조 |
사용 가능 조건 | 기본적으로 생성됨 (AutoField) | Primary Key 필드가 무엇이든 참조 가능 |
커스터마이즈 | 모델에서 primary_key 지정으로 대체 가능 | Primary Key 필드의 이름에 상관없이 동일하게 참조 가능 |
class MyModel(models.Model):
custom_id = models.CharField(max_length=50, primary_key=True)
name = models.CharField(max_length=100)
obj = MyModel(custom_id="A123", name="Example")
obj.save()
print(obj.id) # AttributeError: 'MyModel' object has no attribute 'id'
print(obj.pk) # "A123"
primary_key=True를 지정한 필드가 custom_id라서 id는 존재하지 않지만,
pk는 항상 Primary Key 필드를 참조하기 때문에 사용할 수 있음
- id를 직접 사용하는 경우 : 기본 Primary Key가 id로 설정된 상황에서 사용하는 것이 일반적
- pk를 사용하는 경우 : Primary Key 필드 이름에 의존하지 않고 동적으로 Primary Key를 참조하고자 할 때 사용
Read & Create 연결 정리
• Read 페이지(/)에서 생성된 모든 데이터를 출력
• Create 폼 페이지(/new/)에서 사용자 입력을 통해 데이터를 생성
• 저장된 데이터는 /articles/에서 최신순으로 정렬되어 표시
new에서 넘긴 데이터를 create 화면에 시각적으로 나타내고 싶어서 context에 담아서 templates에 보내서 렌더링 받아옴
안예쁘지만 더 만지기 귀찮..
'∟Framework > ∟Django' 카테고리의 다른 글
Django - MTV 패턴을 활용한 RUD(Read, Update, Delete) 구현 (0) | 2025.01.22 |
---|---|
Django - ORM(Object-Relational Mapping) (1) | 2025.01.14 |
Django - Model (1) | 2025.01.14 |
Django - URLs (0) | 2025.01.14 |
Django - HTTP Form (0) | 2025.01.12 |