python manage.py startapp blogapp
blogapp이라는 이름의 앱 생성
INSTALLED_APPS에 프로젝트에서 사용하는 앱을 등록
blogapp 안에서 홈 화면을 띄울 것이므로 templates를 blogapp으로 옮김
html 문서 작성
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
안녕하세요. 중앙대학교 GDSC.
</body>
</html>
index.html 작성
views.py
def index(request):
return render(request, 'index.html')
render 함수를 통해 요청을 index.html 문서로 리턴
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', blogapp.views.index, name='index'),
]
웹 사이트를 쉽게 만들 수 있게 도와주는 html,css,js 프레임워크
하나의 css로 휴대폰, 태블릿, 데스크탑까지 다양한 기기에서 작동함
즉, 부트스트랩을 이용해 예쁜 페이지를 쉽게 구성할 수 있음
부트스트랩의 examples를 활용하여 페이지 구성
blogapp 내에 static 디렉토리를 생성하여 부트스트랩 html의 css 파일을 관리
settings.py 설정
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'blogapp', 'static')
]
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
settings.py 맨 아래 라인에 위의 코드를 입력하여 정적 파일의 위치를 지정
python manage.py collectstatic
터미널에서 정적 파일들을 한 곳으로 모아주는 명령어 입력
index.html 수정
부트스트랩 html의 코드를 복사하여 장고 프로젝트의 index.html에 붙여넣기
장고 템플릿 언어는 장고로 개발할 때, html 템플릿에서 사용할 수 있는 템플릿 규칙 또는 문법
템플릿 변수, 템플릿 필터, 템플릿 코멘트 등
템플릿 변수
템플릿 필터
템플릿 태그
템플릿 코멘트
블로그 홈 화면 구성과 동일한 방식
views.py
def blogMain(request):
return render(request, 'blogMain.html')
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', blogapp.views.index, name='index'),
path('blogMain/', blogapp.views.blogMain, name='blogMain'),
]
블로그에서 글을 작성하면 그 내용들이 서버에 저장되어야 하고, 저장된 데이터들이 다시 블로그 안에서 보여야 함
데이터들을 서버에 저장하기 위해 데이터베이스 이용
글쓰기 항목의 모델 설계
from django.db import models
class Blog(models.Model):
title = models.CharField(max_length=100)
pub_date = models.DateTimeField()
body = models.TextField()
models.py 파일에 위의 코드를 작성하여 간단한 글쓰기 모델 설계
모델 데이터베이스 적용
python manage.py makemigrations
python manage.py migrate
설계한 모델을 데이터베이스에 적용하기 위해 터미널에서 위의 명령어 입력
admin 페이지에서 설계한 모델이 데이터베이스에 적용되었는지 확인 가능
서버를 실행시킨 후, http://127.0.0.1:8000/admin으로 접속
Tools - Run manage.py Task에서 createsuperuser를 입력하여 관리자 계정 생성
admin 페이지에 블로그 모델 등록
from django.contrib import admin
from .models import Blog
# Register your models here.
admin.site.register(Blog)
admin.py 파일에 블로그 모델 등록
admin 페이지에서 블로그를 추가하였을 때, 블로그 객체가 생성된다면 성공!
글쓰기에 사용할 폼 생성
데이터베이스 모델에서 title, pub_date, body 항목을 가져오는 작업을 수행하기 위함
blogapp 디렉토리 내에 admin.py 생성
from django import forms
from .models import Blog
class CreateBlog(forms.ModelForm):
class Meta:
model = Blog
fields = ['title', 'pub_date', 'body']
글쓰기에 사용되는 폼을 띄워줄 템플릿 생성
blogapp - templates에 createBlog.html 작성
views.py
from .forms import CreateBlog
def createBlog(request):
form = CreateBlog()
return render(request, 'createBlog.html', {'form': form})
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', blogapp.views.index, name='index'),
path('blogMain/', blogapp.views.blogMain, name='blogMain'),
path('blogMain/createBlog/', blogapp.views.createBlog, name='createBlog'),
]
사용자들이 입력한 데이터를 전송하기 위해 createBlog.html에 데이터 전달 폼 구축
<form method="POST">
{{ form.as_p }}
<input type="submit" value="저장"/>
</form>
'POST' 방식으로 폼 안의 데이터가 전달되고, 데이터를 제출하기 위해 'submit' 타입 사용
views.py 파일 내의 createBlog() 함수 수정
from django.shortcuts import render, redirect
def createBlog(request):
if request.method == 'POST':
form = CreateBlog(request.POST)
if form.is_valid():
form.save()
return redirect('blogMain')
else:
return redirect('index')
else:
form = CreateBlog()
return render(request, 'createBlog.html', {'form': form})
POST 데이터 전달 과정에서 보안을 위해 createBlog.html 파일에 '{% csrf_token %}' 추가
html 문서 중 기본 뼈대가 되는 문서를 기본 템플릿으로 정하고, 다른 문서에서 기본 템플릿의 코드가 필요하면 상속하여 가져다 씀
'base.hteml'로 설정
navbar의 내용을 상속받도록 blogMain.html의 코드를 base.html에 붙여넣기
기본 템플릿의 위치가 변경되었으므로 settings.py의 TEMPLATES 수정
blogMain.html에서 아래 내용 추가
{% extends 'base.html' %}
{% block content %}
{% endblock %}
위와 같은 방식으로 createBlog.html 파일 수정
데이터베이스 모델 형태 변경
위의 내용에 맞게 models.py와 forms.py 수정
'body'의 글자를 예쁘게 꾸밀 수 있는 텍스트 편집기
위지위그(WYSIWYG: What You See Is What You Get) 방식 : 블로그나 웹 페이지에서 글을 쓸 때, 눈에 보이는 글씨의 모양 그대로 문서 편집을 할 수 있는 것
CKEditor Tool 설치
pip install django-ckeditor
터미널에 위의 명령어를 입력하여 CKEditor 설치
settings.py 파일 내의 INSTALLED_APPS에 'ckeditor', 'ckeditor_uploader' 등록
사용자들이 업로드하는 파일을 관리하기 위해 settings.py에 'media' 루트 설정
MEDIA_URL = '/media/'
MEDIA_ROOT = 'media/'
settings.py 맨 아래에 위의 코드 추가
urls.py 수정
from django.conf.urls import include
path('ckeditor/', include('ckeditor_uploader.urls')),
ckeditor_uploader가 url을 참조할 수 있도록 설정
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
MEDIA 경로를 참조하기 위해 위의 문장 추가
bloggapp - models.py 수정
from ckeditor.fields import RichTextField
from ckeditor_uploader.fields import RichTextUploadingField
body = RichTextUploadingField()
'collectstatic' 명령어를 입력하여 정적 파일들을 모아준 후, 모델 적용
bloggapp - models.py에서 blogMain() 함수 수정
from .models import Blog
def blogMain(request):
blogs = Blog.objects.all()
return render(request, 'blogMain.html', {'blogs': blogs})
blogMain.html 수정
{% extends 'base.html' %}
{% block content %}
<br>
{% for blog in blogs %}
<main role="main" class="container">
<div class="jumbotron">
<h1>제목 : {{ blog.title }}</h1>
<br>
<h4>작성일 : {{ blog.pub_date }}</h4>
<br>
<h4>작성자 : {{ blog.author }}</h4>
<br>
<p class="lead">{{ blog.body }}</p>
<br>
<a class="btn btn-lg btn-primary"
href="{{ site.baseurl }}/docs/{{ site.docs_version }}/components/navbar/"
role="button">View navbar docs »</a>
</div>
</main>
{% endfor %}
{% endblock %}