django

[Django] CRUD - CREATE

peach_h 2023. 3. 25. 23:58

장고의 기본 CRUD 중 CREATE를 구현해보자 !

 

기본 페이지(index) 만들기
1. project와 app을 생성한다

project / settings.py에 app을 추가해주고,

project / urls.py에 path를 추가해준다.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/', include('app.urls')),
]

 

app / urls.py 파일 생성 후 index path 추가

from django.contrib import admin
from django.urls import path, include
from . import views
app_name = 'app'

urlpatterns = [
    path("", views.index, name="index")
]

 

 

2. 기본틀로 사용할 base.html 생성

나는 부트스트랩을 활용하여 네비게이션 바를 추가할 것이다.

부트스트랩 네비게이션 바 코드

https://getbootstrap.kr/docs/5.2/components/navbar/

 

내비게이션 바

Bootstrap의 강력하고 반응형적인 내비게이션 헤더, 내비게이션 바의 문서와 예. 콜랩스(collapse) 플러그인 지원을 포함한 브랜딩, 내비게이션 등의 지원이 포함되어 있습니다.

getbootstrap.kr

대략 이런 코드인데, 이대로 base.html에 넣어도 되지만

너무 지저분해질 것을 방지하여 html 파일을 분리하기로 결정

 

base.html과 같은 위치에 _navbar.html을 생성한다

- navbar.html

<nav class="navbar navbar-expand-lg bg-light">
    <div class="container-fluid">
        <a class="navbar-brand" href="#">Navbar</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarSupportedContent">
            <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                <li class="nav-item">
                    <a class="nav-link" href="#">Link</a>
                </li>
            </ul>
        </div>
    </div>
</nav>

 

-base.html

include를 활용하여 상단에 navber가 오게 연결해줌

{% include "_navbar.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">
    <!-- CSS only -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
    <title>Document</title>
</head>
<body>
    {% include "_navbar.html" %}
    <div class="mt-4 container">
        {% block content %}
        {% endblock content %}
    </div>
    <!-- JavaScript Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>
</body>
</html>

 

 

3. app / models.py에 class를 생성

나는 제목과 내용 , 생성 시간, 수정 시간 컬럼을 만들기로 결정했다.

from django.db import models

# Create your models here.
class Article(models.Model):
    title = models.CharField(max_length=10)
    content = models.TextField()
    # auto_now_add : 생성시에만, 현재 시간 추가
    created_at = models.DateTimeField(auto_now_add=True)
    # auto_now : 생성 + 수정 시 현재 시간을 저장
    updated_at = models.DateTimeField(auto_now=True)

 

 

4. app / views.py 에 index 함수 정의하기

Article class의 object들을 article로 지정하여 index.html로 렌더링하게 만들었다. 

from django.shortcuts import render
from .models import Article

# Create your views here.
def index(request):
    article = Article.objects.all()
    context = {'article':article}
    return render(request, 'app/index.html', context)

 

 

5. index.html 생성

1. base.hmtl을 상속받게 만들어주기

2. 반복문을 활용하여 모든 article들이 나오게 만들기

3. article이 아무것도 없다면 게시글이 없다고 나오게,

4. 내용은 10자가 넘어가면 ... 으로 나오게 필터를 적용하였다.

{% extends "base.html" %}

{% block content %}
<h1>index</h1>
<h2>게시판 목록</h2>
    {% for article in article%}
    <h3>Number.{{article.pk}}</h3>
    <p>제목 {{article.title}}</p>
    <p>내용 {{article.content|truncatechars:10}}</p>
    <p>작성 시간 : {{article.created_at}}</p>
    <p>수정 시간 : {{article.updated_ar}}</p>
    <hr>
    {% empty %}
        <p>게시글 없음</p>
    {% endfor %}
{% endblock content %}

👇🏻👇🏻기본 html 상속받아 쓰는 법

https://peach-hzz.tistory.com/129 

 

[Django] 하나의 html을 여러 App에서 돌려쓰기

1. Project 안에 templates 폴더를 만든다 기존의 app아래 templates가 아닌, project안 / app 밖에 만들어야함 2. Project의 setting.py 를 수정 3. 필요한 곳에서 'base.html'을 사용하면 된다

peach-hzz.tistory.com

 

 

 

본격 CREATE 기능 구현하기
1. app / urls.py 파일을 생성, create path 추가
from django.contrib import admin
from django.urls import path, include
from . import views
app_name = 'app'

urlpatterns = [
    path("", views.index, name="index"),
    path('create/', views.create, name="create")
]

 

 

2. create.html 생성
{% extends "base.html" %}

{% block content %}
<h3>게시물 만들기</h3>
<!-- 같은 URL로 가도록 구성 -->
<form action="{% url 'app:create' %}" method="POST">
    {% csrf_token %}
    <div>
        <label for="title"> 제목 : </label>
        <input type="text" name="title">    
    </div>
    <div>
        <label for="content"> 내용 : </label>
        <input type="text" name="content">
    </div>
    <input type="submit">
    <input class="btn btn-outline-success" type="submit" value="만들기">
</form>
{% endblock content %}

form으로 입력받은 데이터를 create url로 전송

input type = "submit" 으로 데이터를 전송한다

-> 전송은 GET이 아닌, POST 방식을 이용해야함

 

POST method를 사용했을 때, csrf_token을 필수로 명시해줘야함

관련내용참고 : https://minkukjo.github.io/cs/2020/08/15/Security-1/

 

 

 

3. app / views.py에 create 함수 정의
from django.shortcuts import render, redirect
from .models import Article

# Create your views here.
def index(request):
    article = Article.objects.all()
    context = {'article':article}
    return render(request, 'app/index.html', context)

def create(request):
    if request.method == 'POST':
        # 저장 코드
        title = request.POST.get('title')
        content = request.POST.get('content')
        
        article = Article(title=title, content=content)
        article.save()
        
        return redirect('app:index')
    # GET 요청
    else:
        return render(request, 'app/create.html')

사용한 방식이 POST 라면,

전송 받은 데이터를 article에 저장

redirect로 index페이지에 돌아간다

 

 

4. navbar에 바로가기 추가
<nav class="navbar navbar-expand-lg bg-light">
    <div class="container-fluid">
        <a class="navbar-brand" href="{% url 'app:index' %}">Home</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarSupportedContent">
            <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                <li class="nav-item">
                    <a class="nav-link" href="{% url 'app:create' %}">CREATE</a>
                </li>
            </ul>
        </div>
    </div>
</nav>

 

 

5. runserver로 확인

네비게이션 바에 CREATE을 누르면, CREATE 페이지로 이동된다

만들기 버튼을 눌러서 데이터를 전송하면 index 페이지에서 CREATE한 게시물 확인 가능

CREATE 구현 완료 !

수 많은 확인용 게시물들 ..