인프런 커뮤니티 질문&답변

kwonjiwoo님의 프로필 이미지

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

instagram post_detail 뷰 구현

No post matches the given query

작성

·

462

0

강사님 안녕하세요, 오류가 발생해서 질문 드립니다 ㅜㅜ

http://127.0.0.1:8000/post/1/
로 접속을 하면

계속 이와 같은 오류가 뜹니다 ㅠㅠ

이렇게 분명 포스트가 db 에 저장되어있는데 말이죠 .. ㅠㅠ

이전에 작성했었다가 사용자를 다시 지우면서 같이 삭제된 포스팅이 있는데 그것 때문에 pk 값이 꼬인 것은 아니겠죠?

 

urlpatterns = [
    path('post/new/', views.post_new, name='post_new'),
    path('post/<int:pk>/', views.post_detail, name='post_detail')
]

(제 앱 이름은 myblog 로 해두었습니다)

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, redirect, render
from .forms import PostForm
from .models import Post

# Create your views here.

@login_required
def post_new(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save() # 이걸 나중에 하면 안되나?
            post.tag_set.add(*post.extract_tag_list())
            messages.success(request, "포스팅을 등록했습니다.")
            return redirect("/") # TODO : get_absolute_url 활용
    else:
        form = PostForm()
    
    return render(request, "myblog/post_form.html", {
        "form": form,
    })


def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, "myblog/post_detail.html", {
        "post" : post,
    })

views.py

import re
from django.conf import settings
from django.db import models
from django.urls import reverse

# Create your models here.

class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    photo = models.ImageField(upload_to="myblog/post/%Y/%m/%d")
    caption = models.CharField(max_length=1000)
    tag_set = models.ManyToManyField('Tag', blank=True)
    location = models.CharField(max_length=100)
    
    def __str__(self):
        return self.caption
    
    def extract_tag_list(self):
        tag_name_list = re.findall(r"#([a-zA-Z\dㄱ-힣]+)", self.caption)
        tag_list = []
        for tag_name in tag_name_list:
            tag, _ = Tag.objects.get_or_create(name=tag_name)
            tag_list.append(tag)
        return tag_list
    
    def get_absolute_url(self):
        return reverse("myblog:post_detail", args=[self.pk])
    

class Tag(models.Model):
    name = models.CharField(max_length=50, unique=True)

    def __str__(self):
        return self.name

models.py

이상한 부분은 없는 것 같습니다만 왜 이러는지 모르겠네요..ㅠㅠ

그런데 또 쌩뚱맞은 http://127.0.0.1:8000/post/5/

url 을 입력하면

아래와 같이 다른 오류가 뜹니다..

감사합니다 ! ㅠㅠ

답변 2

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

아래의 오류에서 "No Post matches the given query" 부분을 보셔야 합니다.

Raised by : myblog.views.post_detail 이라고 되어있죠. post_detail 뷰를 통해 발생한 예외이구요.

지정 pk=1 의 Post가 조회가 되지 않아, 404 오류가 발생한 것입니다. get_object_or_404 메서드는 지정 조건의 데이터가 없으면 아래와 같은 404 오류를 발생시킵니다.

image

이와 반대로 어떤 URL에 매칭되는 View가 없으면 아래와 같은 오류가 발생합니다. 같은 Page not found (404) 지만 세부 내역이 다름을 확인하실 수 있습니다.

image

데이터베이스에서 pk는 primary key의 약자로서 기본키를 뜻합니다. 장고 모델에서는 id 이름의 기본키가 디폴트로 생성이 되며, 저장되는 Post마다 1부터 1씩 자동증가하며 할당됩니다.

pk=1, 2, 3 의 Post가 없는 것은 생성하신 후에 삭제하셔서 그렇습니다. 삭제한 Post는 pk를 다시 1부터 되돌리진 않습니다. 삭제된 것은 삭제된 것으로 처리하기 위함입니다.

화이팅입니다. :-)

kwonjiwoo님의 프로필 이미지
kwonjiwoo
질문자

감사합니다 !! 그럼 pk=1,2,3 은 앞으로 계속 비어있는 건가요?

이진석님의 프로필 이미지
이진석
지식공유자

그렇습니다. :-)

kwonjiwoo님의 프로필 이미지
kwonjiwoo
질문자

감사합니다 !!!!!

0

kwonjiwoo님의 프로필 이미지
kwonjiwoo
질문자

post_detail 에서 extends 부분을 잘못 적어서 수정하였더니

이렇게 뜹니다 !! 그런데 url 보이시는 것처럼 pk 값이 1부터가 아니라 4부터 정상적으로 뜹니다.. ㅠㅠㅠㅠ 왜이럴까요 선생님?!! ㅜㅜㅜㅜ