Leta Learns

django | CRUD - Read 본문

Django

django | CRUD - Read

leta 2021. 7. 6. 14:17

 

CRUD => DB 내의 데이터를

Create 생성하다 | Read 읽다 | Update 수정하다 | Delete 삭제하다

Read

웹페이지 상에서 데이터를 읽어야 하므로 띄워줄 HTML 파일 필요
=> blog 앱 내에 templates/home.html

views.py

from django.shortcuts import render
from .models import Blog 

# Create your views here. 

def home(request): 
	blogs = Blog.objects.all() #Blog 객체를 모두 가져온다. -> Blog 테이블의 모든 row를 가져온다.
	return render(request, 'home.html', {'blogs' : blogs})

blogs 라는 변수에 바로 윗줄에서 선언한 blogs를 key:value 형태로 저장.


urls.py

from django.contrib import admin
from django.urls import path
from blog.views import * #blog.views에서 선언한 모든 것을 가져옴 

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

from blog.views import *
=> views의 모든 것을 import해옴
views.home 대신 home만으로 해결
(urls.py 작성 부분 다시 볼 것!)




QuerySet 쿼리셋
: 전달받은 모델의 객체 목록 (객체들이 쿼리셋의 형태로 저장)
쿼리셋에 여러 객체가 들어있으면 for문 사용

{% for blog in blogs %}
	{{ blog }}
{% endfor %}

for문 끝나면 꼭 닫아주기 => {% endfor %}

{{ blog }} => 객체 출력. models.py에서 __str__로 self.title이 나오게 설정했으므로 여기서도 제목이 나올 것임.

{% for blog in blogs %} 
	{{ blog.title }} 
	{{ blog.writer }} 
	{{ blog.body }} 
{% endfor %}

=> blog 객체 내부 값 title, writer, body를 불러옴




본문(Text) 내용이 길면 요약하는 게 편함 => models.py에 summary 메소드 추가

class Blog(models.Model):
	title = models.CharField(max_length=200)
	writer = models.CharField(max_length=10) 
	pub_date = models.DateTimeField() 
	body = models.TextField() 
    
	def __str__(self): 
		return self.title 
    
	def summary(self): 
		return self.body[:100]

=> body의 내용을 최대 100자까지만 보여준다.
summary 메소드 추가한 다음
home.html에서 {{ blog.body }} -> {{ blog.summary }}


 

Path-converter

페이지 하나 만들 때 => urls.py에 path 만들기
함수, html 페이지 만들기.
=> detail 페이지의 경우 DB 내 데이터 개수만큼 페이지가 하나씩 있어야 함.
=> path, 함수 각각 하나씩 다 지정해줘야 함. => 귀찮음
=> 이때, Path-converter 사용
=> id 값만 적어주면 다르게 보여줄 수 있음. views.py에 있는 매개변수로 넘겨줄 수도 있음.

views.py

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

# Create your views here. 

def home(request):
	blogs = Blog.objects.all() #Blog 객체를 모두 가져온다. -> Blog 테이블의 모든 row를 가져온다.
	return render(request, 'home.html', {'blogs': blogs}) 
    
def detail(request, id):
	blog = get_object_or_404(Blog, pk=id) #매개변수로 받은 id값이 있는 블로그의 데이터를 가져옴 or 404에러
	return render(request, 'detail.html', {'blog': blog})

detail 함수에는 매개변수 하나 더 추가 (id)

django.shortcuts에서 get_object_404 메소드를 import
=> 찾을 수 없는 경우 404 처리.

get_object_404 의 매개변수는 2가지

  1. models.py에서 받아온 Blog
  2. pk (Primary Key, 기본 키) (= id)

blog = get_object_or_404(Blog, pk=id)
=> models.py에 있는 Blog를 가져온 것이므로 detail.html에서도 title, writer, pub_date, body 사용 가능.


urls.py

from django.contrib import admin
from django.urls import path
from blog.views import * #blog.views에서 선언한 모든 것을 가져옴

urlpatterns = [
	path('admin/', admin.site.urls),
	path('', home, name='home'),
	path('<int:id>', detail, name='detail'),
]

<int: >

  • int : 정수형
  • id : views.py 내 detail 함수에서 정한 매개변수의 이름
  • name='detail' : 접근할 수 있도록


(<int:id>에서의 id 값 부분 다시 보기!)
path-converter부터 복잡하고 어려움. 주기적으로 다시 봐야 할 듯.

Comments