CS Activity/Likelion 11th

[멋쟁이사자처럼 11기] 5회차: Django C, R

Jenn28 2023. 3. 27. 19:30

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>