∟Framework/∟Django

Django - MTV패턴을 활용한 C(Create)와 R(Read) 구현

최 수빈 2025. 1. 18. 12:38

 

 

Django의 MTV(Model-Template-View) 패턴은

CRUD(Create, Read, Update, Delete) 작업을 명확하게 구현할 수 있도록 구조화되어 있음

 

 

 

C(Create) : 사용자 입력 폼과 데이터 저장 로직을 작성, 새로운 데이터를 데이터베이스에 저장

R(Read) : 저장된 데이터를 데이터베이스에서 조회, 템플릿에 렌더링하여 사용자에게 표시

연계 : Create에서 저장된 데이터를 Read에서 즉시 확인할 수 있도록 설계

 

 

 

 

모델 설계

 

앱(articles)내의 models.py - 데이터 구조 정의

articles/models.py

 

 

 

 

View 정의

 

앱(articles)내의 views.py

articles/views.py

 

 

Read(articles) : views.py에서 Model에 접근해 data를 가져와 Template으로 전달

Create(new, create) :

new view에서 새 글 작성 화면 제공, 새로운 데이터 작성 ->

create view에서 데이터 넘겨받기 ->

넘겨받은 데이터로 새로운 데이터 처리 및 저장

 

 


템플릿 작성

 

Template에서 넘어온 context 보여주기(전달받은 데이터 출력)

articles/templates/articles.html

=> View에서 Templates을 랜더링해서 반환

 

• id : 각 레코드 고유 값

 title: 제목

 content: 내용

 created_at: 생성 시간 (자동 기록)

 updated_at: 업데이트 시간 (자동 기록)

 

/articles/



 

클라이언트에서 서버에 데이터를 전송하여 저장

 

 

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/urls.py

 

앱(articles)내의 templates/new.html(method = "GET")

articles/templates/new.html(method = "GET")ver.

 

앱(articles)내의 new.html(method = "POST")

/articles/templates/new.html(method = "POST")ver.

 

 

7번 line에 {% csrf_token %}코드 넣어줌

 

/articles/views.py

 

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

articles/templates/create.html

 

articles/create



/articles/new/

 

/articles/new에 데이터 작성
/articles/create/

 

 

 

templates에서 Id를 받아오지 않았을 때

/articles/




id 받아오고 POST방식으로 변경 후

 

 

created_at(생성일)기준 내림차순해서 데이터를 들고와 렌더링

 

articles/views.py/articles.order_by("-created_at")ver.

   

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를 참조하고자 할 때 사용

 

 

/articles.order_by("-created_at")ver.

 

 

 

 

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