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.
관리자 홈페이지 경로
프로젝트 기본 세팅 mysite/settings.py
- 모드
DEBUG = TRUE //개발자모드
DEBUG = FALSE //운영모드 - 주소
ALLOWED_HOSTS = []
*개발자모드인 경우 자동으로 127.0.0.1로 인식
운영모드인 경우 반드시 기재해줘야함
ALLOWED_HOSTS = [‘127.0.0.1′,’localhost’,’주소’,’도메인’] - 프로젝트 내 앱 등록
INSTALLED_APPS = [
] - 기본 시간 변경
TIME_ZONE = ‘UTC’
TIME_ZONE = ‘Asia/Seoul’
애플리케이션 생성 Board
- python manage.py startapp board
- 프로젝트에 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)
데이터베이스 반영하기
- 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'),
]