django 004 | CRUD : Read

13477 단어 djangodjango

1. Read 실습

=> 이전 실습인 blog app 에서부터 시작
1. views.py 수정

def home(request):
    blogs=blog.objects.all()
    return render(request, 'home.html',{'blogs':blogs})

=> home이라는 함수 넘겨줄 때 블로그에 있던 인자들 모두를 같이 home.html로 render 해줌

  1. views 손댔으니깐 urls 고쳐주기

(1) app의 views import 해주고

from blog import views

(2) path 추가

path('', views.home, name="home"),
  1. home.html 수정해주기
    (1) 이때 먼저 home.html을 다음과 같이 수정하면 글의 쿼리셋만 나오며 불완전하게 보인다
<body>
    <h1>Blog Project</h1>
    {% for blog in blogs %}
        {{blog}}}
    {% endfor %}
</body>

(2) 따라서 (1)보다 조금 더 세세하게 출력해주도록 해야함

<body style="text-align: center;">
    <h1>Blog Project</h1>
    {% for blog in blogs %}
        제목 : {{blog.title}} <br><br>
        작성자 : {{blog.writer}} <br><br>
        내용 : {{blog.body}} <br><br>
    {% endfor %}
</body>

=>

  1. (+) summary 기능 추가하기

(1) model에 summary 함수 추가

    def summary(self):
        return self.body[:100] #파이썬 슬래쉬 기능으로 100자까지 잘라주기

(2) home.html 수정

내용 : {{blog.body}}

위의 친구를

내용 : {{blog.summary}}

로 수정

  1. detail을 볼 수 있는 페이지도 만들어줘야 함

path-converter : 원래 데이터 베이스 요소 하나 당 그에 부합하는 페이지가 존재해야 한다. 근데 일일히 이를 만들고, views 설정, url 연결은 거의 불가능 => path-converter 기능을 통해

(1) view 에 detail 함수 추가

def detail(request, id):
    Blog=get_object_or_404(blog, pk=id) 
    #여기서 두개를 가져올거임 (1)테이블 : (2)pk를 가져오는 것
    #pk는 row를 구별해주는 친구
    # pk =매개변수를 받은 id
    #이는 쿼리셋이 아닌 오브젝트 하나만을 가져옴
    return render(request, 'detail.html', {'blog':Blog})

=> blog에서 id값 받아서 이를 pk로 받아주며 구별해주고 돌려줄 때 id에 해당하는 아이를 돌려주는 것

(2) 이 id 값은 url 조정을 해줌으로써 사용자가 id에 따라 다른 결과 보게 해줌, so url 경로 추가

    path('<str:id>', views.detail, name="detail" ),
  • 데이터 아이디 값에 따라 값이 다르게 나오게 된다
  • 두번째 인자는 views의 함수이름
  • 마지막은 path 이름

(3) 마지막으로 이 id값은 어디서 얻어오는가?
=> 바로 home.html에서 전달받아오는 것

    <div class="container">
    <h1>Blog Project</h1>
    {% for blog in blogs %}
        제목 : {{blog.title}} <br><br>
        작성자 : {{blog.writer}} <br><br>
        내용 : {{blog.summary}} <a href="{ %url 'detail' blog.id $}")>...more</a>
    {% endfor %}
</div>
  • a태그를 통해 (<a href="{ %url 'detail' blog.id $}")>...more) detail url을 사용할 때 해당 blog.id 속성도 같이 전달해주는 것

(4) detail.html 수정

<body>
    <h1>{{blog.title}}</h1>
    {{blog.writer}}<br><br>
    {{blog.pub_date}}
    <br>
    {{blog.body}}
    
</body>

결과물 :


(+) 디버깅

views.py에서 처음에 아래와 같이 썼었음

def detail(request, id):
    blog=get_object_or_404(blog, pk=id) 
    return render(request, 'detail.html', {'blog':Blog})

blog=get_object_or_404(blog, pk=id)
이 문장에서 뒤에 나오는 blog와 앞의 blog가 same해서 충돌 오류 났던 것
그래서 앞에 변수명을 Blog로 바꿨다

좋은 웹페이지 즐겨찾기