• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

category에서

20.08.16 08:00 작성 조회수 125

0

models.py의 Post 클래스에서 category를 blank=True로 설정하잖아요. 차라리 '미분류'라는 디폴트값을 둘 순 없나요? 그러니까 모든 Post 모델들은 따로 설정하지 않았을때 '미분류' 카테고리에 자동으로 연결이 되는거죠.

그럼 템플릿에 굳이 if문으로 미분류 카테고리를 나눌 필요가 없지 않을까요

답변 1

답변을 작성해보세요.

0

맞습니다! 장고를 잘 이해하게 되셨다고 생각이 들어서 기뻤습니다. 

저도 강의 만들떄 어떤 방식으로 구현할지 고민했습니다. sonagi 님이 생각하신 방법이 더 합리적이라고 생각들기도 했습니다. 

다만, 파이썬 상속 개념이 익숙하지 않은 학생들이 많을까봐 일부러 피한 면이 있습니다. 

말씀하신 것처럼 하려면, Post 모델만 수정하면 됩니다. 다만, 아직 안 배운 save 함수를 오버라이딩 해서 사용해야 합니다. 

save가 되기 전에, Post의 category가 None이면, 

Category.objects_get_or_create()로 name이 '미분류'이고, slug='none'인 Category를 db에서 찾아오거나 없으면, 새로 만들어서 가져옵니다. 

get_or_create로 가져오면 가져온 인스턴스(db기준으로 말하면 레코드)와 새로 만들었는지 여부를 동시에 가져옵니다. 첫번째가 카테고리 인스턴스이고, 두번째가 새로 만들었는지 여부이므로 아래처럼 하시면 됩니다. 

원하는 동작을 했으면 원래 models.Model에서 제공하는 save기능을 그대로 이용할 수 있도록 super()의 save를 사용하도록 합니다. 

class Post(models.Model):
title = models.CharField(max_length=30)
content = MarkdownxField()

head_image = models.ImageField(upload_to='blog/%Y/%m/%d/', blank=True)

created = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)

category = models.ForeignKey(Category, blank=True, null=True, on_delete=models.SET_NULL)
tags = models.ManyToManyField(Tag, blank=True)

class Meta:
ordering = ['-id', ]

def __str__(self):
return '{} :: {}'.format(self.title, self.author)

def get_absolute_url(self):
return '/blog/{}/'.format(self.pk)

def get_update_url(self):
return self.get_absolute_url() + 'update/'

def get_markdown_content(self):
return markdown(self.content)

def save(self, *args, **kwargs):
if self.category is None:
self.category, is_created = Category.objects.get_or_create(name='미분류', slug='none')
return super(Post, self).save(*args, **kwargs)