[REAL Python – Django] – “Django – 3번째 카테고리에만 글을 쓸 수 있도록 지정하기”
[REAL Python – Django] – “Django – 3번째 카테고리에만 글을 쓸 수 있도록 지정하기”
구현하고 싶은 것
현재 만드는 블로그에서는 3차 카테고리까지만 URL패턴이 지정되어 있습니다. 어드민 페이지에서 포스트를 작성할 때에 최종 카테고리(3차 카테고리)에만 글을 작성할 수 있도록 하고, 카테고리를 추가할 때에 해당 카테고리가 포스트를 쓸 수 있는 카테고리인지를 판별하는 것을 구현하려고 합니다.
Category
클래스에 is_postable
불리언 필드 추가하기
기본적으로 카테고리가 포스트를 쓸 수 있는 상태인지, 아닌지를 판별하는 불리언필드가 필요합니다.
Post
클래스에 limit_choices_to
옵션 추가
위처럼 딕셔너리 형태로 코드를 작성하면, 카테고리의 “is_postable
” 이라는 필드가 True
인 것만 뽑아내 어드민 페이지에 보여주겠다는 것입니다. 실제로 위의 두 작업을 수행한 후, is_postable
필드를 True
로 저장한 이후 포스트를 새로 작성해 봅시다. 그러면 True
로 설정한 카테고리만 선택 가능하게끔 설정된 것을 알 수 있습니다.
카테고리를 저장할 때에, 최종 카테고리만 is_postable
필드가 True
로 저장되도록 하기
def save(self, *args, **kwargs):
try:
# 부모의 부모 카테고리가 존재하고, 부모의 부모의 부모 카테고리가 존재하지 않으면 -> 3차 카테고리임
if self.parent.parent and not self.parent.parent.parent:
self.is_postable = True
else:
self.is_postable = False
except AttributeError:
self.is_postable = False
super(Category,self).save(*args, **kwargs)
save()
메서드를 오버라이딩했는데, 만약 3차 카테고리인 경우 True
로, 아닌 경우에는 False
로 저장되도록 하였습니다. 만약 1차 카테고리인 경우 부모 카테고리가 존재하지 않으므로 – AttributeError
가 발생하기 때문에, 기본값인 False
로 지정되게끔 했습니다!
잘 작동하는지 보겠습니다!
마찬가지로 4차 카테고리(나중에 4차 카테고리를 만들지 못하도록 해 보겠습니다.) 까지 생성을 해 보면, 3차 카테고리에만 작성이 가능한 True가 저장된 것을 볼 수 있네요.
만약 새 포스트를 작성하려고 한다면, 카테고리를 선택하는 콤보박스에 blog, mall, enviroment, 3rdcategory 만 나타나야 합니다.
의도했던 대로 3차 카테고리인 것들만 잘 나타나는 것을 볼 수 있습니다. 오늘의 구현 성공!!
잘보고갑니다
감사합니다 그레이드승민님!