1)
class Post(models.Model):
...
def get_absolute_url(self):
return reverse("instagram:post_detail", args=[self.pk])
views.py에 post_view 함수 혹은 DetailView의 인스턴스 함수를 정의해줄 때 pk/slug 인자를 사용한다. 그리고 해줘야할 작업은 get_absolute_url을 정의해주는 것이다. 그런데 해당 함수가 없어도 /post/pk로 접근하는데 에러가 발생하지 않았다.
args=[self.pk]가 아닌 kwargs={"pk":self.pk}를 대신 사용할 수 있다.
reverse 함수가 django.urls에 있는 점이 의미심장하다.
2)
{{ post.author.name }}
post_detail.html에 post를 던지는 views.py의 post_detail 함수는 get_object_or_404 함수를 통해서 Post 클래스를 참조한다.
Post 클래스의 author 인자는 현재 활성화된 유저 모델과 외래키로 연결돼 있는데 이것이 User 클래스라서 property 장식자로 연결된 name 함수를 인자처럼 사용할 수 있는 것처럼 보인다.
property 장식자의 쓰임새 중 큰 부분은 메소드를 필드처럼 사용할 수 있게 해준다는 데 있다.
3)
{% if user.avatar %}
<img src="{{ user.avatar.url }}" />
{% else %}
<image src="{% url "pydenticon_image" user.username %}" style="width: 24px; height: 24px;" />
{% endif %}
<img src="{{ user.avatar_url }}" style="width: 24px; height: 24px;" />
+
@property
def avatar_url(self):
if self.avatar:
return self.avatar.url
else:
return resolve_url("pydenticon_image", self.username)
프로젝트의 layout.html 상에서만 구현했던 avatar가 있을 때/없을 때의 조건이, 다른 경로에서도 사용할 일이 많아져서, accounts 앱의 models.py에서 property 장식자 하에 구현해주고 이를 인자의 형태로 사용한다.