📌 settings.py 내용 수정
"""
Django settings for study1 project.
Generated by 'django-admin startproject' using Django 4.1.4.
For more information on this file, see
<https://docs.djangoproject.com/en/4.1/topics/settings/>
For the full list of settings and their values, see
<https://docs.djangoproject.com/en/4.1/ref/settings/>
"""
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See <https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/>
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = "django-insecure-zskt0=@(+^8=+-&_+_!!3fbt=_hyw&+0!@-epor%4!vo&72@tv"
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"member",
"board",
]
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
ROOT_URLCONF = "study1.urls"
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [BASE_DIR/'templates'],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]
WSGI_APPLICATION = "study1.wsgi.application"
# Database
# <https://docs.djangoproject.com/en/4.1/ref/settings/#databases>
'''
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
'''
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": 'kic',
"USER": 'kic',
"PASSWORD": '1234',
"HOST": 'localhost',
"PORT": '3307'
}
}
# Password validation
# <https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators>
AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",},
{"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",},
{"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",},
]
# Internationalization
# <https://docs.djangoproject.com/en/4.1/topics/i18n/>
# LANGUAGE_CODE = "en-us"
LANGUAGE_CODE = "ko-kr"
# TIME_ZONE = "UTC"
TIME_ZONE = "Asia/Seoul"
USE_I18N = True
**#USE_TZ = True
USE_TZ = False # UTC 적용 안함.**
# Static files (CSS, JavaScript, Images)
# <https://docs.djangoproject.com/en/4.1/howto/static-files/>
STATIC_URL = "/static/" # css, js 파일의 위치
# Default primary key field type
# <https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field>
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
import os
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] # css, js 파일의 위치 폴더 설정
# 파일 업로드 폴더, URL설정
MEDIA_URL = "/file/"
MEDIA_ROOT = os.path.join(BASE_DIR,"file")
📌 urls.py - board 내용 추가
# -*- coding: utf-8 -*-
"""
Created on Fri Dec 23 11:08:02 2022
@author: HP
"""
from django.urls import path
from . import views
urlpatterns=[
path("write/", views.write, name="write"),
**path("list/",views.list, name="list"),**
]
📌 views.py - board 내용 추가
from django.shortcuts import render
from .models import Board
from django.utils import timezone
from django.http import HttpResponseRedirect
**from django.core.paginator import Paginator**
# Create your views here.
def write(request) :
if request.method != "POST" :
return render(request,"board/write.html")
else : # POST 방식 요청
try :
filename = request.FILES["file1"].name
handle_upload(request.FILES["file1"])
except :
filename = ""
# num :
b = Board(name = request.POST["name"],\\
pass1 = request.POST["pass"],\\
subject = request.POST["subject"],\\
content = request.POST["content"],\\
regdate = timezone.now(),\\
readcnt = 0, file1 = filename)
b.save()
return HttpResponseRedirect("../list")
def handle_upload(f) :
with open("file/board/" + f.name, "wb") as dest :
for ch in f.chunks() :
dest.write(ch)
**def list(request) :
# pageNum 파라미터를 정수형으로 형변환.
# 파라미터가 없으면 1이 기본값.
pageNum = int(request.GET.get("pageNum",1))
# 모든 레코드 조회.
# order_by("-num") : num값의 내림차순 정렬.
all_boards = Board.objects.all().order_by("-num")
# Paginator : all)boards 목록을 10개씩 분리해서 저장.
paginator = Paginator(all_boards,10)
# paginator 객체에서 pageNum번째 게시물 리턴
# board_list : 해당 페이지에 출력할 게시물 목록을 저장
board_list = paginator.get_page(pageNum)
# 등록된 게시물 건수.
listcount = Board.objects.count()
return render(request,"board/list.html",\\
{"board":board_list, "listcount":listcount})**
📌 list.html 내용 생성
{% extends "base1.html" %}
{% block content %}
<table border="1" width="100%" cellpadding="0" cellspacing="0"
class="table table-bordered table-hover">
<tr align="center">
<td colspan="4">장고 게시판</td>
{% if listcount == 0 %}
<td align="center">등록된 글이 없습니다.</td>
{% else %} {# 등록된 게시물이 존재하는 경우 #}
<td align="center">글개수 :{{listcount}}</td>
</tr>
<tr align="center" valign="middle">
<td width="8%">번호</td><td width="50%">제목</td>
<td width="14%">작성자</td><td width="17%">날짜</td>
<td width="11%">조회수</td></tr>
{% for bo in board %} {# 게시글 출력#}
<tr align="center" valign="middle">
<td>{{bo.num}}</td><td align="left">
{# 첨부 파일이 존재하면 @로 표시함 #}
{% if bo.file1 %}
<a href="/file/board/{{bo.file1}}">@</a>
{% else %} {# 첨부파일이 없는 경우 공백 표시함#}
{% endif %}
{# 첨부 파일 종료 #}
<a href="../info/{{bo.num}}/">{{bo.subject}}</a></td>
<td>{{bo.name}}</td><td>{{bo.regdate}}</td>
<td>{{bo.readcnt}}</td></tr>
{% endfor %}
<!-- Pagination -->
<tr><td colspan="5" style="text-align:center">
<div class="pagination">
<div style="width:35%; margin: 5px; display:inline">
{% if board.has_previous %} {# 앞 페이지가 존재? #}
<a class="abutton" href="?pageNum=1">맨 앞으로</a>
<a class="abutton" href="?pageNum={{ board.previous_page_number }}">이전</a>
{% endif %}
</div>
<div style="width:30%; margin: 5px; display:inline">
{# board.paginator.page_range : 전체 제공된 페이지 번호#}
{% for page in board.paginator.page_range %}
{# 현재 페이지 번호를 포함해서 5개씩만 페이지 번호를 표시 #}
{% if page >= board.number|add:-2 and page <= board.number|add:2 %}
<span class="{% if page == board.number %}current{% endif %}">
<a href="?pageNum={{ page }}">{{ page}}</a>
</span>
{% elif page >= board.number|add:-3 and page <= board.number|add:3 %}
..
{% endif %}
{% endfor %}
</div><div style="width:35%; margin: 5px; display:inline">
{% if board.has_next %} {# 다음 페이지가 존재 ?#}
<a class="abutton" href="?pageNum={{ board.next_page_number }}">다음</a>
<a class="abutton" href="?pageNum={{ board.paginator.num_pages }}">맨 뒤로</a>
{% endif %}
</div></div></td></tr>
{% endif %}
<tr align="right"><td colspan="5"><a href="../write">[글쓰기]</a></td></tr>
</table>
{% endblock content %}
- 결과
'수업(국비지원) > Django' 카테고리의 다른 글
[Django] 2022-12-23 복습 (0) | 2023.04.27 |
---|---|
[Django] 게시글 상세보기 (0) | 2023.04.27 |
[Django] 게시판 등록 (0) | 2023.04.27 |
[Django] 게시판 생성 (0) | 2023.04.27 |
[Django] 비밀번호 수정 (0) | 2023.04.27 |