자, 배포를 하면 무조건 사용자의 문의가 온다. 나중에는 사용자의 정보를 다루게 될 지도 모른다. 그런 민감한 정보에는 전부 접근을 할 수 없기에 뭐가 필요하다? 관리자용 페이지가 필요하다.
그래서 만든다? ㄴㄴ 장고가 다 제공해줍니다.
어디있다? 처음 프로젝트를 만들 때 url에 보면 admin이라는 path가 있습니다. 바로 그것이 관리자 페이지입니다.
그 path로 가서 superuser의 계정으로 접속하면 됩니다.
참고로 관리자 페이지에서 사용할 모델은 직접 등록해주는것이 필요합니다. 각 앱의 admin.py에서 설정 가능합니다.
이렇게
참고로 커스텀도 넣을 수 있습니다(검색바 넣기 등..)
그리고 그냥 데코레이터로 상속 시키면 됩니다.
Model Relationship
app과 다른 app과의 관계. 1:N, N:N?
예를 들어 하나의 아티클에선 여러개의 댓글이 나온다? 그럼 1:N, 하지만 하나의 아이템은 하나의 유저만 살 수 있다? 그럼 1:1 그러면 이제 그걸 CRUD 즉, A와 B라는 테이블이 있을 때, A가 만약에 B에서 ID를 참조한다면, A에서 참조하는 개념은 B의 ID를 고유하게 식별할 수 있어야 합니다.
그래서 이런걸 가지고 뭘 할 수 있냐, 바로 댓글같은 기능을 구현할 수 있습니다. models.ForeignKey(<참조하는 모델 클래스>, on_delete=<옵션>)
on_delete 옵션 CASCADE 부모가 삭제되면 이를 참조하는 객체도 삭제 PROTECT 참조하는 객체가 있을경우 예외를 발생시켜 삭제 방지 SET_NULL 참조하는 객체가 삭제될 경우 NULL 값으로 지정 즉, 첫번째 줄은 Article이란 fk를 연결, 및 CASCASE모델을 적용 예를 들어, 게시글이 있는데, 만약 그 게시글이 삭제가 되면? 댓글들을 어떻게 처리할지에 대한 방법
자, 이제 python manage.py shell_plus가서 comment = Comment() comment.content = 'first comment' comment.save를 하면 에러가 납니다.
왜? 코드를 보면 content를 쳤고, created, updated_at은 이미 자동 생성을 완료했는데, article만 안 써서 그렇습니다. 그래서 에러가 났습니다. 어떻게 해결한다? 그냥 들고오면 됩니다.
정참조 예를 들어, comment 클래스는 안에 값에 접근을 할 수 있습니다. why? 정보가 안에 담겨있기 때문입니다. 즉, 서로간의 참조를 하기에 정참조고 합니다.
역참조 하지만 한 클래스는 다른 클래스에 뭐가 담겨있는지 알지 못합니다. 그렇기에 서로 접근하기 위해서는 다른 매니저를 부릅니다 그것이(_set)입니다 그래서 일반 클래스.참조 클래스_set.all()로 접근한 것입니다.
참고로 저거 이름도 바꿀 수 있습니다.
이렇게 말입니다.
자자, 빠르게 넘어갑시다 이제 코드도 조금 이해가 가니 forms.py
models.py
views.py
.html
그런데 여기서 문제, 위에 코드를 보면 우리는 article이라는 값을 exclude했습니다. 그런데 값은 뭐다? 두개 다 들어가야합니다(아니면 id오류) 그래서 값을 부르는 단계와 .save()하기전에 단계 중간을 잡아줘야 합니다.(즉 전처리 과정? 비슷한거인데 save()에서 지원합니다)
일단 commit = False가 그 역할을 하며, 이 단계는 인스턴스를 반환하기 때문에 받아줄 변수를 적고, commit=False이면 아직 저장단계까지는 False로 간주하기 때문에, 그 단계에서 article을 넣어주면 됩니다.
이렇게 save()를 마지막으로 넣어줍니다. 즉, commit = False를 작성함으로써 중간에 공간을 만들어주는 겁니다.
Custom user Model
지금까지 장고 모델을 썼지만, 직접 만들어보자!
참고로 이렇게 프로젝트 중간에 하면 여러가지 오류가 생긴다. 그러므로 처음부터 시작하자 마자, 저 usermodel을 써주는게 좋다. 그래서 Django에서 db를 삭제했다. 먼저,
db.sqlite3 삭제, migration 폴더 삭제(안에 내용물만..__init__은 절대 x) 그리고 다시 makemigrations, migrate한다 그러면 서버가 잘 동작하는데, 아이디를 만들 때 문제가 발생한다.
아까 바꿔준 사용자 모델 때문이다.
views에서 우리는 UserCreationForm을 썼다. 하지만 이건 auth에서 가져온터라, 우리의 클래스가 사용되어야 한다는 뜻이다.
그러면 뭐다? 가져와서 오버라잇만 하면된다.
그런데 만약 fields에 뭘 적을지, 혹은 다 가져올지 모르겠다? 그러면 그 안에(Meta.fields)있는 모든 fields를 다 가져와라는 뜻입니다. 그리고 만약 추가하고 싶은게 있으면 model에 먼저 가서 적고,
이렇게 더하면 됩니다 .
그리고
어드민 등록(우리가 작성한 User 어드민을 UserAdmin으로 등록해달라는 뜻이다.)
참고로 만약 중간에 추가를 하면 다 삭제후 해야한다. 왜냐하면 모든 마이그레이션은 연결되어 있기 때문