본문 바로가기
Back-end/Django

[Django] CRUD - Read

by 안녕주 2021. 7. 19.

CRUD란 Create, Read, Update, Delete의 줄임말이다.

1.   blogapp에 template폴더를 만들고 home.html를 생성한다. 

2. views.py에서 home함수 생성

from django.shortcuts import render
from .models import Blog  #blog 데이터를 가져오기위해

def home(request):
    blogs = Blog.objects.all() #blog table의 객체들을 전체다 가져온다
    return render(request, 'home.html', {'blogs' : blogs})  # blogs 변수를 home.html과 함께 보낸다.

3. urls.py에 path 추가    

from django.contrib import admin
from django.urls import path
from blog.views import *  #blog 앱의 views.py의 모든 함수를 가져온다.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name="name"),
]

 4. home.html 작성   

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initia-scale=1.0">
        <title>BLOG</title>
    </head>
    <body>
        <h1>Blog Project</h1>
        {%for blog in blogs %} <!--객체 하나하나 for문으로 확인-->
            {{blog}} <!--제목만 뜸-->
        {% endfor %}
    </body>
</html>

  

5. 객체의 제목이 아니라  내부의 column을 보고 싶다면..?

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initia-scale=1.0">
        <title>BLOG</title>
        <style>
            body{text-align: center;}
        </style>
    </head>
    <body>
        <h1>Blog Project</h1>
        <div class="container">
        {%for blog in blogs %} <!--객체 하나하나 for문으로 확인-->
            <div>
            <h3>{{blog.title}} </h3>
            {{blog.writer}}
            {{blog.body}}
            <br>
            </div>
        {% endfor %}
        </div>
    </body>
</html>

home.html

6. 본문내용은 보이지 않게 하기위해 긴 body를 가진 object를 추가하자.

7.  models.py에 summary 함수를 생성해서 본문을 잘라서 보이도록 해주자

from django.db import models

#table의 형식 만들기
class Blog(models.Model): 
    title = models.CharField(max_length=200)
    writer = models.CharField(max_length=100)
    pub_date = models.DateTimeField()
    body = models.TextField()

    def __str__(self):
        return self.title

    def summary(self):
        return self.body[:100] #100인덱스까지 슬라이싱

8. home.html의 {{blog.body}} 를 {{blog.summary}}로 변경하자

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initia-scale=1.0">
        <title>BLOG</title>
        <style>
            body{text-align: center;}
        </style>
    </head>
    <body>
        <h1>Blog Project</h1>
        <div class="container">
        {%for blog in blogs %} <!--객체 하나하나 for문으로 확인-->
            <div>
            <h3>{{blog.title}} </h3>
            {{blog.writer}}
            <!--{{blog.body}}-->
            {{blog.summary}}
            <br>
            </div>
        {% endfor %}
        </div>
    </body>
</html>

home.html


Detail 페이지 생성하기

Path-converter : detail 페이지는 DB의 개수마다 페이지가 하나씩 있어야한다. 따라서 path는 계속해서 늘어난다. url로 path값을 적어주면 ID값을 통해 페이지가 다르게 보인다. 

  

1. templates/detail.html을 만들어준다.

2. views.py에 함수를 만든다. 

from django.shortcuts import render, get_object_or_404 
from .models import Blog

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

def detail(request, id):  #매개변수를 하나더 받는다 # 404에러를 뜨게 하거나 blog를 띄우거나
    blog = get_object_or_404(Blog,pk=id) #pk는 기본키, 관계형 DB에서 식별자를 뜻한다.
    return render(request, 'detail.html', {'blog' : blog})

 3. urls.py 에 path-converter 생성

- path-converter를 통해 detail함수의 매개변수로 id를 전달해주고... table에서 객체를 찾고...datail페이지에 DB를 전달

from django.contrib import admin
from django.urls import path
from blog.views import *  #blog 앱의 views.py의 모든 함수를 가져온다.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name="name"),
    path('<str: id>', detail, name="detail") # <자료형 : id(매개변수의 이름)> , 함수이름, 접근을 할 수 있는 name
    #path-converter : 다른 페이지로 이동을 할 때, DB의 아이디 값에 따라 페이지가 다르게 보인다.
]

4. home.html에 detail.html 연결하기

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initia-scale=1.0">
        <title>BLOG</title>
        <style>
            body{text-align: center;}
        </style>
    </head>
    <body>
        <h1>Blog Project</h1>
        <div class="container">
        {%for blog in blogs %}
            <div>
            <h3>{{blog.title}} </h3>
            {{blog.id}}
            {{blog.writer}}
            {{blog.summary}} <a href="{% url 'detail' blog.id %}"> ...more </a> <!--detail이라는 url에 요청을 보내는데, blog.id도 같이 보낸다.-->
            <br>
            </div>
        {% endfor %}
        </div>
    </body>
</html>

5. detail.html 만들기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Detail</title>
    <style>
        body{text-align: center;}
    </style>
</head>
<body>
    <h1>{{blog.title}}</h1> <br>
    {{blog.writer}} <br>
    {{blog.pub_date}} <br>
    {{blog.body}} <br>
</body>
</html>

6. runserver를 통해 확인해보자

python manage.py runserver

home.html

 

detail.html

'Back-end > Django' 카테고리의 다른 글

[Django] CRUD - Update  (0) 2021.07.19
[Django] CRUD - Create  (0) 2021.07.19
[Django] Model 실습  (0) 2021.07.19
[Django] Django와 데이터베이스  (0) 2021.07.19
[Django] Git 사용법  (0) 2021.07.19

댓글