기존에는 Django Admin 에서 Tag 를 정의해서 저장하면 ManyToManyField 로 정의되어있는 Tag 가 바로 저장이 되지 않는 버그가 있었습니다.
[ AS-IS 코드 ]
class Post(TimeStampedModel):
...
def_tag = models.CharField(max_length=150, null=True, blank=True)
tag_set = models.ManyToManyField('Tag', blank=True)
...
def tag_save(self):
tags = re.findall(r'#(\w+)\b', self.def_tag)
if not tags:
return
for t in tags:
tag, tag_created = Tag.objects.get_or_create(tag_name=t)
self.tag_set.add(tag)
def save(self, *args, **kwargs):
saved = super(Post, self).save(*args, **kwargs)
# TAG 저장
if self.def_tag:
self.tag_save()
return saved
기존 코드를 보면 `Post` Model 에서 save 메서드를 오버라이드 해서 Tag 를 저장했습니다.
하지만 이 방식은 Django Admin 에서 바로 작동하지 않았습니다.
관련 이슈는 아래 링크에 보면 됩니다.
[ TO-BE 코드 ]
기존의 코드는 불필요한 코드를 제거하고 아래와 같이 save_related 를 오버라이드 해서 문제를 해결했습니다.
class Post(TimeStampedModel):
...
def_tag = models.CharField(max_length=150, null=True, blank=True)
tag_set = models.ManyToManyField('Tag', blank=True)
...
def tag_save(self):
tags = re.findall(r'#(\w+)\b', self.def_tag)
if not tags:
return
for t in tags:
tag, tag_created = Tag.objects.get_or_create(tag_name=t)
self.tag_set.add(tag)
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
...
def save_related(self, request, form, formsets, change):
super().save_related(request, form, formsets, change)
instance = form.instance
if instance.def_tag:
instance.tag_save()