You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
admin.py에서 만든 모델 from .models import {model name}로 import하고 admin.site.register(model name) 해서 연동해주기
$ python manage.py createsuperuser로 관리자계정 만들고 관리자 페이지에서 대분류(반?) 데이터 생성
ForeignKey 옵션
on_delete: 연결된 데이터가 지워졌을 때 어떻게 처리할지 지정한다. models.PROTECT는 데이터를 살려두고, models.CASCADE는 같이 삭제한다.
related_name: 연결된 다른 테이블에서 나를 조회할 때 사용할 이름
기타 데이터 관리를 위한 필드 추가
is_deleted=models.BooleanField(default=False)
# 지워진 것을 바로 삭제하지 않고 디스플레이만 안되게끔 하는 필드importtimecreated_at=models.DateTimeField(default=time.time())
# 그냥 하면 SQL의 시간이 기록되기 때문에 파이썬이나 자바스크립트로의 변환이 번거롭다. 그래서 time.time()으로 유닉스타임을 default로 넣어준다.default_created_at=models.DateTimeField(auto-created)
# SQL에서 쓰기 위한 default_created_at을 이렇게 따로 만들기도 한다.updated_at=models.DateTimeField(default=time.time())
각 클래스마다 이렇게 is_deleted, created_at, updated_at 등을 넣어주기 귀찮으니까 아예 반복을 피하기 위해 상속을 사용하기도 한다. 가독성을 위해 각각 해줘야한다는 의견도 있다.
Create Read 기능 추가 로직
model.py에 create나 add 함수를 만들고, add 페이지에서 form을 통해 데이터를 등록하면 redirect로 데이터 생성 후 연결될 페이지를 리턴해준다.
migration 폴더에서 클래스를 확인해보면 우리가 만들지 않은 id라는 값도 추가되어있는데, 이게 바로 primary key이다. 나중엔 hashed string으로 커스텀해주기도 한다. user가 숫자를 유추해서 접근하면 안되니까.
class_detail 함수에서 pk값을 받아서 해당 class 페이지를 보여주게끔 한다.
get_object_or_404(ClassRoom, pk=class_pk): try except 에러처리를 이미 구현해둔 메서드이기 때문에 편리하다.
from django.shortcuts import get_object_or_404로 import해준다.
add 함수를 호출한 결과 학생들의 정보가 나열된 class_detail 페이지로 redirect 해야하는데, 이를 위해 아까 add.html에서 classroom.pk를 받았으니까 함수에서도 class_pk를 받아서 이를 redirect('class_detail', class_pk)로 리턴해준다.
render와 redirect 비교
둘다 django.shortcuts로부터 import 해줘야한다.
render는 인수로 request, 렌더링할 html 파일, context(optional)을 받는다.
redirect는 인수로 urls.py에서 지정한 이름, 즉 경로 이름을 받는다. 이 때 경로가 <int:pk> 등으로 엔드포인트에서 다른 요소를 받으면 두 번째 인수로 해당하는 요소를 넘겨주어야 한다.
render을 하면 그 경로에서 html 파일만 던져주는 것이기 때문에 주소는 여전히 해당 경로이다. 화면상에서는 detail.html을 보여주지만 주소는 여전히 'add/'인 상황.
redirect를 써주면 서버응답도 302가 나온다. 즉 서버에서 미리 작성해둔 url로 데려가주는 것.
client 요청에서 온 data를 DB에 반영해주기
views.py에서 add 함수를 통해, client에서 온 요청과 데이터를 DB에 추가해주는 작업
그냥 일반적인 화면 렌더링의 GET 요청인지, client에서 POST method로 온 요청인지에 구분하기 위해 if문을 추가해준다.
models.py에 정의된 클래스 안의 인스턴스 변수들을 템플릿에서 받는 form을 만들었을 것이다. form 안의 태그들에 각각의 어트리뷰트로 name을 지어줬을텐데, 그것을 키로 하여 딕셔너리 값 참조하듯 request.POST['key']로 하여 데이터를 받을 수 있다.
이를 모델의 objects 매니저 객체에 create 메서드를 호출하며 인스턴스 변수에 할당해주면 DB에 반영된다.
내가 만든 Student 모델에는 이름과 소개만 넣었기 때문에 템플릿에서도 그 두 개를 받는 태그를 넣었고, add 함수에서도 이 두개를 받는다.