해결된 질문
작성
·
135
0
#test.py
def test_post_detail(self):
post_000 = create_post(
title='The first post',
content='hello wolrd.',
author=self.author_000,
)
self.assertGreater(Post.objects.count(), 0)
post_000_url = post_000.get_absolute_url()
self.assertEqual(post_000_url, '/blog/{}/'.format(post_000.pk))
response = self.client.get('/blog/{}/'.format(self.pk)) # post_000.get_absolute_url()의 소스를 가져오겠다 << 이 부분!
! self.assertEqual(response.status_code, 200)
soup = BeautifulSoup(response.content, 'html.parser')
title = soup.title # soup = html 태그 가져옴
# models.py
def get_absolute_url(self):
return '/blog/{}/'.format(self.pk)
test.py에서
제가 이부분이라고 표시한 곳에서
post_000_url이나 '/blog/{}/'.format(self.pk) 나 같다고 생각해서
전자대신 후자를 넣고 테스트를 돌렸는데
AttributeError: 'Testview' object has no attribute 'pk' 가 뜨더군요
pk가 models.py 에서도 쓰이고 urls.py 에서도 쓰이는데
왜 여기서 쓸수 없는지 궁금합니다
답변 2
1
안녕하세요. 장고의 기능을 많이 이해하고 응용하시고 계셔서 질문을 받고 기뻤습니다.
post_000_url을 쓸 떄와 '/blog/{}/'.format(self.pk)와 다르지 않다고 판단하셨다고 했는데요.
장고 테스트를 돌렸을 때, TestView는 pk가 없다고 답하는건 당연한 현상입니다.
왜냐하면, TestView 안에서 self는 의미할 때는 Post를 의미하지 않고, TestView를 의미하기 때문입니다.
반대로 Post 클래스의 get_absolute_url 함수에서 self를 썼을 때, 그 Post의 인스턴스(데이터베이스 기준에서는 레코드)를 의미합니다. self가 Blog 클래스 안에 있으니까요.
바꾸신 스타일로 변경하길 원하신다면, '/blog/{}'.format(post_000.pk)라고 하셔야 합니다. 그렇게 하면, post_000은 Post의 인스턴스(데이터베이스 식으로 표현하면 레코드)가 되므로 self가 post_000를 의미하기 때문입니다.
0