Create
Read
Update
Delete
ORM: 객체-관계형 DB 연결
1. Read
home.html
<h1>블로그 홈페이지</h1>
<div>
{% for blog in blogs %}
<h2>{{blog.title}}</h2>
<p>{{blog.created_at}}</p>
<p>{{blog.content}}</p>
<p>{{blog.hobby}}</p>
{% endfor %}
</div>
models.py: summary 함수 추가
from django.db import models
# Create your models here.
class Blog(models.Model):
title = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
content = models.TextField()
hobby = models.TextField()
def __str__(self):
return self.title #제목 타이틀로 바꾸기
def summary(self):
return self.content[:100] #100자까지만 출력
home.html (수정)
<h1>블로그 홈페이지</h1>
<div>
{% for blog in blogs %}
<a href="{% url 'detail' blog.id %}">상세 보기</a>
<h2>{{blog.title}}</h2>
<p>{{blog.created_at}}</p>
<p>{{blog.summary}}</p>
<p>{{blog.hobby}}</p>
{% endfor %}
</div>
path-converter: 여러 객체들을 다루는 계층적 url이 필요할 경우 사용
<type:name>
-> 지정한 converter type의 name변수를 view함수로 넘겨라
urls.py (blog)
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
path('blog/<int:blog_id>', views.detail, name="detail"),
]
get_object_or_404(class 이름, pk=id값): path-converter로부터 넘겨 받은 blog_id를 받아 Blog 객체들 중 pk값이 blog_id인 것이 있으면 가져오고, 그렇지 않으면 404 에러를 발생시켜라
views.py: detail 함수 만들어줌
from django.shortcuts import render
from .models import Blog
from django.http import HttpResponse
# Create your views here.
def home(request):
blogs = Blog.objects.all()
return render(request, 'home.html', {'blogs':blogs})
def detail(request, blog_id):
blog = get_object_or_404(Blog, pk=blog_id)
return render(request, 'detail.html',{'blog':blog})
urls.py (session)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]
2. Create
urls.py (blog)
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
path('blog/<int:blog_id>', views.detail, name="detail"),
path('blog/new', views.new, name="new"), #추가
path('blog/create', views.create, name="create"), #추가
]
views.py
from django.shortcuts import render, get_object_or_404, redirect
from .models import Blog
from django.http import HttpResponse
# Create your views here.
def home(request):
blogs = Blog.objects.all()
return render(request, 'home.html', {'blogs':blogs})
def detail(request, blog_id):
blog = get_object_or_404(Blog, pk=blog_id)
return render(request, 'detail.html', {'blog':blog})
def new(request):
return render(request, 'new.html')
def create(request):
new_blog = Blog()
new_blog.title = request.POST['title']
new_blog.content = request.POST['content']
# new_blog.created_at = request.POST['created_at']
# new_blog.hobby = request.POST['hobby'] #new.html에서 제목/본문 두개만 받기때문에 빼야함
new_blog.save()
return redirect('detail', new_blog.id)
POST방식이 GET방식보다 privacy 좋음
new.html
<h1>새 글 작성하기</h1>
<form action="{%url 'create'%}" method="POST">
{% csrf_token %}
제목: <input type="text" name="title"/>
본문: <textarea name="content" id="" cols="30" rows="10"></textarea> #textarea의 크기 지정
<input type="submit" value="작성하기"/>
</form>
home.html
<h1>블로그 홈페이지</h1>
<a href="{%url 'new'%}">새 글 작성하기</a>
<div>
{% for blog in blogs %}
<a href="{% url 'detail' blog.id %}">상세 보기</a>
<h2>{{blog.title}}</h2>
<p>{{blog.created_at}}</p>
<p>{{blog.summary}}</p>
<p>{{blog.hobby}}</p>
{% endfor %}
</div>