카테고리 없음

스파르타 AI-8기 TIL(12/17)-Django

kimjunki-8 2024. 12. 17. 21:45
Django Admin
관리자 페이지
자, 배포를 하면 무조건 사용자의 문의가 온다. 나중에는 사용자의 정보를 다루게 될 지도 모른다. 그런 민감한 정보에는 전부 접근을 할 수 없기에 뭐가 필요하다? 관리자용 페이지가 필요하다.

그래서 만든다? ㄴㄴ 장고가 다 제공해줍니다.

어디있다? 처음 프로젝트를 만들 때 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=<옵션>)
class Comment(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    content = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.content​

 

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으로 등록해달라는 뜻이다.)

참고로 만약 중간에 추가를 하면 다 삭제후 해야한다. 왜냐하면 모든 마이그레이션은 연결되어 있기 때문


여기까지