• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

pk 질문 있습니다

20.07.26 21:34 작성 조회수 91

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

윤태영님의 프로필

윤태영

질문자

2020.07.28

self를 생각못했군요
정말감사합니다