• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

view on site 가 제대로 동작을 안합니다

20.06.01 15:23 작성 조회수 278

0

테스트 포스트의 pk는 7이고 그거 하나 뺴고 다 지워둔 상태입니다.

127.0.0.1:8000/blog/7/  로 들어가면 정상적으로 포스트가 나오는데 admin 페이지의 view on site 버튼을 누르면 127.0.0.1:8000/admin/r/7/7/ 로 들어가지고 

페이지가 작동하지 않습니다.

127.0.0.1에서 잘못된 응답을 전송했습니다.

ERR_INVALID_REDIRECT

이런 창이 뜹니다..

그냥 패스하고 그 다음인 tests.py에서 get_absolute_url을 테스트하는 부분으로 넘어가니

self.assertEqual(Post.objects.get_absolute_url(), 'blog/{}'.format(post_000.pk))

self.assertEqual(Post.objects.get_absolute_url(), 'blog/{}'.format(post_000.pk))

AttributeError: 'Manager' object has no attribute 'get_absolute_url'

이런 메시지가 뜨면서 테스트도 실패합니다.

제가 get_absolute_url()함수를 잘못 만든걸까요?

models.py

from django.db import models
from django.contrib.auth.models import User

class Post(models.Model):
    title = models.CharField(max_length=30)
    content = models.TextField()
    head_image = models.ImageField(upload_to='blog/%Y/%m/%d/', blank=True)
    created = models.DateTimeField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.title) + ' :: ' + str(self.author)

    def get_absolute_url(self):
        return 'blog/{}/'.format(self.pk)

tests.py

from django.test import TestCase, Client
from bs4 import BeautifulSoup
from .models import Post
from django.utils import timezone
from django.contrib.auth.models import User

def create_post(title, content, author):
    blog_post = Post.objects.create(
            title = title,
            content = content,
            created = timezone.now(),
            author = author,
        )
    return blog_post

class TestView(TestCase):
    def setUp(self):
        self.client = Client()
        self.author_000 = User.objects.create(username='Smith', password='nopassword')

    def test_post_list(self):
        response = self.client.get('/blog/')
        self.assertEqual(response.status_code, 200)
        soup = BeautifulSoup(response.content, 'html.parser')
        title = soup.title
        
        self.assertEqual(title.text, 'blog')

        navbar = soup.find('div', id='navbar')
        self.assertIn('Blog', navbar.text)
        self.assertIn('About Me', navbar.text)

        self.assertEqual(Post.objects.count(), 0)
        self.assertIn('아직 게시물이 없습니다', soup.body.text)

        post_000 = create_post(
            title = 'test post',
            content = 'hello world',
            author = self.author_000,
        )

        self.assertGreater(Post.objects.count(), 0)

        response = self.client.get('/blog/')
        self.assertEqual(response.status_code, 200)
        soup = BeautifulSoup(response.content, 'html.parser')

        self.assertNotIn('아직 게시물이 없습니다', soup.body.text)

    def test_post_detail(self):
        self.assertEqual(Post.objects.count(), 0)
        post_000 = create_post(
            title = 'test post',
            content = 'hello world',
            author = self.author_000,
        )
        self.assertGreater(Post.objects.count(), 0)
        self.assertEqual(Post.objects.get_absolute_url(), 'blog/{}'.format(post_000.pk))

답변 1

답변을 작성해보세요.

0

models.py에서 get_absolute_url()은 

return '/blog/{}/'.format(self.pk)가 되어야 합니다. 맨 앞에 슬래쉬를 빼놓으셨네요. 

그리고 맨 마지막에 Post.objects.get_absolute_url() 이 아니라, post_000.get_absolute_url() 아닌가요?