There’s another set of model methods that encapsulate a bunch of database behavior that you’ll want to customize. In particular you’ll often want to change the way save() and delete() work.
여기서는 save()를 오버라이딩해보도록 하겠습니다.
model을 통해 만들어지는 구체적인 model들은 전부가 predifined된 method인 save를 가지고 있을 것입니다. 이를 오버라이딩하기 위해서는 super()를 통해 가져와야 합니다.
공식 문서를 가져와 보면 다음과 같이 간단하게 처리할 수 있습니다.
model을 통해 만들어지는 구체적인 model들은 전부가 predifined된 method인 save를 가지고 있을 것입니다. 이를 오버라이딩하기 위해서는 super()를 통해 가져와야 합니다. 정말로 저장을 하게 만들고 싶을 때 super를 통해 기존에 정의된 save() 기능을 활용하면 됩니다.
from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def save(self, *args, **kwargs):
do_something()
super().save(*args, **kwargs) # Call the "real" save() method.
do_something_else()
super()를 불러오지 않고 return 해서 저장을 팅겨내는 방식으로 작동하게끔 만들 수도 있습니다.
from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def save(self, *args, **kwargs):
if self.name == "Yoko Ono's blog":
return # Yoko shall never have her own blog!
else:
super().save(*args, **kwargs) # Call the "real" save() method.
저는 다음과 같이 self.city를 저장 이전에 interception해서 조작한 후 저장해주었습니다. 이제 city는 첫 글자가 대문자화 되어서 저장됩니다.
def save(self, *args, **kwargs):
self.city = str.capitalize(self.city)
super().save(*args, **kwargs)
그런데, Model 뿐만 아니라 Admin 패널 또한 커스터마이징할 수 있습니다.
ModelAdmin methods에 있는 save_model, delete_model 등 등 종류가 많습니다.
save_model을 예시로 보면, save_model은 해당 모델을 저장할 때마다 일어나는 메서드입니다.
# admin.py 에서 작성해야 하는 내용입니다.
def save_model(self, request, obj, form, change):
# 모델을 저장하면 곧 바로 메일을 보내도록 세팅함
send_mail()
super().save_model(request, obj, form, change)
'Django, Flask > 🔫 Django' 카테고리의 다른 글
django-seed와 faker를 이용해 커스텀 명령어로 데이터 생성하기 (0) | 2020.05.13 |
---|---|
custom django-admin commands (0) | 2020.05.13 |
어드민 패널 개선하기: raw_id_field, inline admin (0) | 2020.05.13 |
업로드 다루기: Meida와 static의 차이, mark_safe (0) | 2020.05.13 |
모델/어드민 내에서 로직 설계, 어드민 패널에 반영하기 (0) | 2020.05.12 |