Django 장고 앱, Board – 장고설치, 프로젝트 생성, Board CRUD

Django 설치

sudo pip3 install Django
sudo pip3 install Django -upgrad

*Window 환경에서는 Python을 사용

Django App – Board / 프로젝트 생성

django-admin startproject 프로젝트명

django-admin startproject mysite

기본테이블 생성(sqlite3)

프로젝트가 생성되면 기본 테이블을 생성한다

python manage.py migrate

서버 테스트

python manage.py runserver 0.0.0.0:8000

관리자 계정 생성

python manage.py createsuperuser
Username (leave blank to use 'vudgh'): admin
Email address: debtolee@gmail.com
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

관리자 홈페이지 경로

http://localhost:8000/admin

프로젝트 기본 세팅 mysite/settings.py

  1. 모드
    DEBUG = TRUE //개발자모드
    DEBUG = FALSE //운영모드
  2. 주소
    ALLOWED_HOSTS = []
    *개발자모드인 경우 자동으로 127.0.0.1로 인식

    운영모드인 경우 반드시 기재해줘야함
    ALLOWED_HOSTS = [‘127.0.0.1′,’localhost’,’주소’,’도메인’]
  3. 프로젝트 내 앱 등록
    INSTALLED_APPS = [

    ]
  4. 기본 시간 변경
    TIME_ZONE = ‘UTC’
    TIME_ZONE = ‘Asia/Seoul’

애플리케이션 생성 Board

  1. python manage.py startapp board

  2. 프로젝트에 board 애플리케이션 등록 mysite/settings.py

INSTALLED_APPS = [   
 ‘django.contrib.admin’,  
  ‘django.contrib.auth’,  
  ‘django.contrib.contenttypes’,   
 ‘django.contrib.sessions’,  
  ‘django.contrib.messages’,    
‘django.contrib.staticfiles’,  
  ‘board.apps.BoardConfig’,
]

Moduel에 class 정의 (DB에 테이블 생성)

from django.db import models
# Create your models here.
class Board(models.Model):
    board_id = models.AutoField(primary_key=True)
    subj = models.CharField(max_length=200)
    cont = models.TextField(max_length=200)
    hit =  models.IntegerField(default=0)
    wdate = models.DateTimeField(auto_now_add=True)
    def __str__(self):
                    return self.subj

Model에서 작성한 데이터 Admin 사이트에 반영하기

from django.contrib import admin
# Register your models here.
from board.models import Board
admin.site.register(Board)

데이터베이스 반영하기

명령어 입력 전 db.sqlite3 파일
  • python manage.py makemigrations
  • python manage.py migrate

명령어 입력후 db.sqlite3 파일

서버를 실행해 admin 사이트에 접속하여 생성된 테이블을 확인한다

Template 생성

/board/templates/board/index.html
templates/board 디렉터리 생성 후 index.html template 파일을 작성한다

Template – index

index.html

<input type="button" value="글쓰기" onClick="location.href='{% url 'board:new' %}'"/>
{% if board_list %}
	<ul>
	{% for board in board_list %}
		<li><a href="{% url 'board:detail' board.board_id %}">{{board.subj}}</a></li>
	{% endfor %}
	</ul>
{% else %}
	<p>No board are available</p>
{% endif %}

view.py

view.py에서 model과 template 사이에서 처리를 도와준다
본 애플맅케이션에서는 index 함수를 통해 Board 테이블 0~5까지 데이터들을 불러와 index.html template에 변수로 넘겨준다

from django.shortcuts import render
from board.models import Board
def index(request):
    board_list = Board.objects.all().order_by('-wdate')[:5]
    context = {'board_list':board_list}
    return render(request,'board/index.html',context)

urls.py 맵핑

mysite/urls.py에 board.urls를 등록해줘 board/urls.py가 작동할 수 있도록 등록해준다

from django.contrib import admin
from django.urls import path,include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('board/',include('board.urls'))
]

board.urls에 index를 맵핑한다

from django.urls import path
from board import views
app_name='board'
urlpatterns = [
    path('',views.index, name='index'),
]

view에서 정의한 index를 연결해주고 index라는 이름을 정의했다.

Template – new

new.html

<form action="" method="post">
	제목<input type="text" name="subj" />
	내용<input type="text" name="cont"/>
	<input type="submit" value="저장"/>
</form>

view.py

from django.shortcuts import render,get_object_or_404,redirect
from board.models import Board
@csrf_exempt
def new(request):
    if request.method == "POST":
        subj =request.POST.get('subj')
        cont = request.POST.get('cont')
        board = Board(subj=subj,cont=cont)
        board.save()
        return redirect("/board")
    else:
        return render(request,'board/new.html')

urls.py

from django.urls import path
from board import views
app_name='board'
urlpatterns = [
    path('',views.index, name='index'),
    path('new/',views.new,name='new'),
]

Template – detail

detail.html

<form action="{% url 'board:edit' board.board_id %}" method="post">{{ csrf_input }}
	번호<input type="text" readonly name="board_id" value="{{ board.board_id }}"/>
	제목<input type="text" readonly name="subj" value="{{board.subj}}"/>
	내용<input type="text" readonly name="cont" value="{{board.cont}}"/>
	조회수<input type="number" readonly name="hit" value="{{ board.hit }}"/>
	작성일<input type="datetime" readonly name="wdate" value="{{ board.wdate }}"/>
	<input type="submit" value="수정"/>
	<input type="button" value="삭제" onclick="location.href='{% url 'board:delete' board.board_id %}'"/>
</form>

view.py

from django.shortcuts import render,get_object_or_404
from board.models import Board
def detail(request, board_id):
    board = get_object_or_404(Board, pk=board_id)
    i = board.hit + 1
    board.hit = i
    context = {'board':board}
    return render(request,'board/detail.html',{'board':board})

urls.py

from django.urls import path
from board import views
app_name='board'
urlpatterns = [
    path('',views.index, name='index'),
    path('new/',views.new,name='new'),
    path('<int:board_id>',views.detail,name='detail'),
]

Template – edit

edit.html

<form action="/board/{{board.board_id}}/update/" method="post">{{ csrf_input }}
	번호<input type="text" name="board_id" value="{{ board.board_id }}"/>
	제목<input type="text" name="subj" value="{{board.subj}}"/>
	내용<input type="text" name="cont" value="{{board.cont}}"/>
	조회수<input type="number" name="hit" value="{{ board.hit }}"/>
	작성일<input type="datetime" name="wdate" value="{{ board.wdate }}"/>
	<input type="submit" value="저장"/>
</form>

view.py

from django.shortcuts import render,get_object_or_404
# Create your views here.
from board.models import Board
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def edit(request,board_id):
    board = get_object_or_404(Board, pk=request.POST['board_id'])
    context = {'board':board}
    return render(request,'board/edit.html',{'board':board})

post 형태로 데이터를 전달할 때는 보안 상 csrf_exempt를 설정해줘야 한다

urls.py

from django.urls import path
from board import views
app_name='board'
urlpatterns = [
    path('',views.index, name='index'),
    path('new/',views.new,name='new'),
    path('<int:board_id>',views.detail,name='detail'),
    path('<int:board_id>/edit/',views.edit,name='edit'),
]

Template – update

view.py

from django.shortcuts import render,get_object_or_404,redirect
# Create your views here.
from board.models import Board
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def update(request,board_id):
    board = Board.objects.get(pk=board_id)
    board.subj = request.POST.get('subj')
    board.cont = request.POST.get('cont')
    board.save()
    return redirect("/board")

urls.py

from django.urls import path
from board import views
app_name='board'
urlpatterns = [
    path('',views.index, name='index'),
    path('new/',views.new,name='new'),
    path('<int:board_id>',views.detail,name='detail'),
    path('<int:board_id>/edit/',views.edit,name='edit'),
    path('<int:board_id>/update/',views.update),
]

Template – delete

view.py

from django.shortcuts import render,get_object_or_404,redirect
# Create your views here.
from board.models import Board
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def edit(request,board_id):
    board = get_object_or_404(Board, pk=request.POST['board_id'])
    context = {'board':board}
    return render(request,'board/edit.html',{'board':board})

urls.py

from django.urls import path
from board import views
app_name='board'
urlpatterns = [
    path('',views.index, name='index'),
    path('new/',views.new,name='new'),
    path('<int:board_id>',views.detail,name='detail'),
    path('<int:board_id>/edit/',views.edit,name='edit'),
    path('<int:board_id>/update/',views.update),
    path('<int:board_id>/delete',views.delete,name='delete'),
]

Leave a Comment