장고의 기본 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/
대략 이런 코드인데, 이대로 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
본격 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 구현 완료 !
수 많은 확인용 게시물들 ..
'django' 카테고리의 다른 글
[Django] admin 계정 생성하기 (0) | 2023.03.25 |
---|---|
[Django] Model (0) | 2023.03.25 |
[Django] HTML form ( HTTP / 데이터 전송 / 데이터 받기) (0) | 2023.03.25 |
[Django] App URL mapping (0) | 2023.03.25 |
[Django] 하나의 html을 여러 App에서 돌려쓰기 (0) | 2023.03.15 |