본문 바로가기
Back-end/Django

[Django] CRUD - Create

by 안녕주 2021. 7. 19.

new.html 생성하기

 

1. views.py에 new함수 생성

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})

def new(request):
    return render(request, 'new.html')

2. templates에 new.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"),
    path('<str:id>', detail, name="detail"), 
    path('new/', new, name="new"),
]

4. home.html에 new.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>
            <a href="{%url 'new' %}">Write</a>
        </div>
        <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> <br>
            </div>
        {% endfor %}
        </div>
    </body>
</html>

5. new.html 작성하기

<h1>Write Your Blog</h1>


<form action="" method="post">
    {%csrf_token%} <!-- 서버에서 csrf공격이 아니라는것을 인식을 함 -->
    <p>제목 : <input type="text" name="title"></p>
    <p>작성자 : <input type="text" name="writer"></p>
    본문 :  <textarea name="body"  id="" cols="30" rows="10"></textarea>
    <button type="submit">Submit</button>
</form>

< GET vs POST >

- GET : 데이터를 얻기 위한 요청, 데이터가 url에 보임

- POST : 데이터를 생성하기 위한 요청, 데이터가 url에 안보임, Csrf 공격 방지(사이트 간 요청 위조는 사이트 취약점 공격중 하나이다.)


Crate 기능 만들기

1. views.py에서 함수 만들기

from django.shortcuts import render,redirect, get_object_or_404 
from django.utils import timezone #추가
from .models import Blog 

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

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

def new(request):
    return render(request, 'new.html')

def create(request):
    #객체들을 저장하는 법
    new_blog = Blog() #Blog라는 클래스, new_blog는 Blog의 object
    new_blog.title = request.POST['title']
    new_blog.writer = request.POST['writer']
    new_blog.body = request.POST['body']
    new_blog.pub_date = timezone.now() #현재 시간을 넣어준다
    new_blog.save() #저장

    #어떤 화면으로 이동할 것인지 , render가 아닌 redirect(원래 있던 페이지로 이동)
    return redirect('detail', new_blog.id) #home.html에서 detail을 넘겨줄때 id값도 넘겨줬기에.. id를 전달해줘야한다.

2. urls.py에 path추가

from django.contrib import admin
from django.urls import path
from blog.views import *  

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

3. new.html의 form action 추가

<h1>Write Your Blog</h1>


<form action="{%url 'create' %}" method="post">
    {%csrf_token%}
    <p>제목 : <input type="text" name="title"></p>
    <p>작성자 : <input type="text" name="writer"></p>
    본문 :  <textarea name="body" id="" cols="30" rows="10"></textarea>
    <button type="submit">Submit</button>
</form>

4. runserver

home.html
new.html
detail.html
home.html

 

 

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

[Django] CRUD - Delete  (0) 2021.07.19
[Django] CRUD - Update  (0) 2021.07.19
[Django] CRUD - Read  (0) 2021.07.19
[Django] Model 실습  (0) 2021.07.19
[Django] Django와 데이터베이스  (0) 2021.07.19

댓글