-
7. Django: ORM-Method, __str__()Python/초간단 장고 Django 2019. 7. 8. 22:38반응형
연재 중 꼭 설명해야 할 부분은 아니지만, 안 하기도 아쉬운 부분이 있어 정리해 보았습니다.
Bookmark object (x)
이건 장고 어드민에서나 {{object_list}}에서 보이는 부분인데 보기 좋지 않습니다.
이 부분을 수정하려면 모델에 __str__() 메서드를 추가해야 합니다.
# bookmarks/models.py from django.db import models class Bookmark(models.Model): title = models.CharField(max_length=40, blank=True, null=True) url = models.URLField('url', unique=True) def __str__(self): # 추가 return self.title
이제 데이터를 입력해보면 Bookmark object (x) 대신 입력한 title을 볼 수 있습니다. ^^
그런데 title을 넣지 않고 url만 입력한 경우 에러가 발생합니다. ㅠ,.ㅠ
__str__ returned non-string (type NoneType)
title 대신 None이 리턴되었고,
파이썬의 None은 문자열이 아니기 때문입니다.__str__ 은 문자열을 리턴해야 합니다.
(문자열을 리턴해야 하는 이유도 뒤에 설명 드리겠습니다.)
2가지 방법으로 해결할 수 있습니다.
하나는 self.title을 str()로 감싸주는 방법입니다.
None 객체가 스트링으로 변환되기 때문에 에러를 피할 수 있습니다.
# bookmarks/models.py from django.db import models class Bookmark(models.Model): title = models.CharField(max_length=40, blank=True, null=True) url = models.URLField('url', unique=True) def __str__(self): return str(self.title) # 수정
또, title이 None일 때 url을 리턴해주는 방법도 있습니다.
이 방법이 좀 더 그럴싸하지 않습니까?
# bookmarks/models.py from django.db import models class Bookmark(models.Model): title = models.CharField(max_length=40, blank=True, null=True) url = models.URLField('url', unique=True) def __str__(self): # 수정 return self.title if self.title else self.url
'1. None을 스트링으로 변환했을 때', '2. title 대신 url을 리턴했을 때'의 결과를 캡처해 보았습니다.
정상적으로 잘 작동합니다.
이제 __str__ 메서드가 궁금해지시죠? 알아보겠습니다.
(문자열을 리턴해야 하는 이유에 대한 답도 됩니다.)
class Cat: def __init__(self, name): self.name = name my_cat = Cat("미묘냥") print(my_cat)
위 코드를 실행하면 결과는 다음과 같습니다.
<__main__.Cat object at 0x0080DE10>
다음 코드를 실행하면 '미묘냥' 이 출력됩니다.
class Cat: def __init__(self, name): self.name = name def __str__(self): return self.name my_cat = Cat("미묘냥") print(my_cat) # 미묘냥
'__str__'은 객체를 문자열로 표현할 때 사용하는 메서드입니다.
예) 객체를 프린트하는 경우,
객체 내에 __str__() 메서드가 있으면,
__str__() 메서드에서 리턴해주는 문자열을 출력하게 됩니다.
새로운 클래스를 작성할 때 __str__()을 같이 작성해주면 디버깅이 편해집니다. ^^
진짜 끝입니다. ^^
감사합니다.
반응형