01. 웹프로그래밍과 Django
네트워크
•
컴퓨터 외 세상의 모든 사물 ⇒ 네트워크로 연결
•
네트워크로 연결된 범위 내에서 모든 웹서비스 이용 가능
client와 server
•
client와 server의 관계
⇒ 데이터를 주고 받음
•
server : client가 제공하는 서비스가 있는 곳
특정 data가 모여있는 곳
client가 특정 data를 보기 위해 도메인이나 프로토콜을 이용해 접근
(주로 "http"라는 통신 프로토콜 이용)
client의 요청에 응답
•
client : server의 어떠한 data를 받거나 보기 위해 사용하는 것.
device와 software로 구성
ex. 웹브라우저, 어플리케이션, 명령 프롬프트, ssh 등
HTTP
•
특징
•
쿠키 vs 세션
쿠키 | 세션 |
data가 pc에 머무름 | data가 서버에 머무름 |
•
쿠키 방식
- 특정 서버에 data 요청 → 응답 → pc에서 유니크한 특정 값(문자열) 생성
→ 서버에 전송 → pc, 서버 모두 쿠키값 존재 → 응답 후 연결 해제
→ 다시 동일한 쿠키값을 가지고 request 들어감 → 서버에서 비교
→ 동일한 값인 경우, 과거에도 접속한 이력이 있음을 확인
→ 마치 과거에서부터 쭉 연결을 유지해 온 것처럼 data 흐름을 이을 수 있음
- 보안성이 다소 낮음 (pc에 쿠키값 생성)
•
세션 방식
- 쿠키 방식과 거의 동일
- pc에서 쿠키값 생성 X ⇒ 서버에서 세션값 생성 후 비교
- 보안성이 높음
•
처리 방식
- POST, GET, PUT, DELETE가 main
- HTML : POST, GET 방식만 form 태그에서 지원
•
POST : 서버에 새로운 data를 생성할 때 (create)
•
GET : 필요한 data를 가져올 때 (read)
•
PUT : 서버에 기존의 data를 수정할 때 (update)
•
DELETE : 서버에 기존의 data를 삭제할 때 (delete)
POST와 GET
•
POST와 GET
URL
•
URL
-프로토콜~도메인 : 서버 진입
Rest와 Django URL 맵핑
•
URL 맵핑
서버 구성
•
서버 구성
- 웹서버 : ex. 그림 한 장 요청 (고정적)
- 어플리케이션 서버 : ex. 날씨 정보 (매번 바뀜 → 동적)
02. Django 설치 및 프로젝트 생성
MVT 패턴
•
MVC 패턴 & MVT 패턴
- MVC : controller가 client의 request를 model에게 위임
→ model이 database에서 data를 controller에 넘김
→ controller가 data를 가공 → client에 응답하기 위해 view를 찾아감
→ 가장 적합한 view를 찾아 client에 응답
⇒ control : 프로그램 실행을 관리
model : database 관리
view : client에게 실제로 보여주는 화면 관리
⇒ 유지 보수가 용이
⇒ ex. Spring FrameWork
- MVT : MVC 패턴에서 이름만 바꾼 것
client 요청 → view에서 model에게 위임 → model이 database에서 data를 view에 넘김
→ view가 data를 가공 → template과 통신 → 가장 적합한 view를 찾아 client에 응답
⇒ control : 프로그램 실행을 관리
model : database 관리
template : client에게 실제로 보여주는 화면 관리
⇒ ex. Django
Dirctory 구조
•
Dirctory 구조
03. Django 프로젝트 설계
Django Framework Flow
•
Django Framework Flow
URLconf(urls.py)
•
URLconf - tempPjt/tempPjt/urls.py
urlpatterns = [
path('student/register/', views.student_register),
path('student/search/', views.student_search),
path('student/modify/', views.student_modify),
path('student/delete/', views.student_delete)
]
Python
복사
- path ('student/register/', views.student_register),
URL(클라이언트 요청 URL) view(함수 또는 메서드)
View(views.py)
•
View - tempPjt/students/views.py
def registerStudent(request):
# 데이터 베이스 등을 이용한 프로그램 실행 결과
return HttpResponse() # Template으로...
Python
복사
•
client의 요청에 따른 애플리케이션 실행 결과를 Template(html), 에러 메시지 등을 이용해서
client에게 response 한다.
Model(models.py)
•
Model - tempPjt/students/models.py
⇒ ORM(Object Relational Mapping) 사용
# SQL -> class를 이용한 맵핑
class Student(models.Model):
s_name = models.CharField(max_length = 30)
s_major = models.CharField(max_length = 30)
# students_student 테이블 생성
# 애플리케이션 이름 + _ + 클래스명(소문자)
Python
복사
Template(*.html)
•
Model - tempPjt/tempPjt/settings.py 에서 Template 파일 검색 디렉토리 정의
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
HTML
복사
TEMPLATES = [
[
'BACKEND' : 'django.template.backends.django.DjangoTemplates',
'DIRS' : [],
'APP_DIRS' : True,
'OPTIONS' : [
'context_processorst' : [
'django.template.context_processors.debug',
'django.eemplate.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
],
],
]
HTML
복사
프로젝트 설정(/tempPjc/settings.py)
•
settings.py - 프로젝트의 전체적인 설정을 담당
- 모든 애플리케이션을 설정 파일에 등록
# 애플리케이션의 설정 클래스를 이용한 등록
from django.apps import AppConfig
class StudentsConfig(AppConfig):
name = 'students'
Python
복사
- 개발모드와 운영모드 설정
1) DEBUG = True
DEBUG = True # 개발모드
DEBUG = False # 운영모드
Python
복사
2) ALLOWED_HOSTS = [loalhost', '127.0.0.1']
# 개발모드 : 입력하지 않아도 자동으로 localhost로 정의
# 운영모드 : 서버 IP주소 입력
Python
복사
기본 사용자 및 그룹 테이블 생성
•
기본 사용자 및 그룹 테이블 생성
C:\Django\pjt\tempPjt>python manage.py migrate
C:\Django\pjt\tempPjt>python manage.py makemigrations
C:\Django\pjt\tempPjt>python manage.py migrate
TypeScript
복사
관리자 계정 생성 및 서버 구동
•
기본 사용자 및 그룹 테이블 생성
C:\Django\pjt\tempPjt>python manage.py createsuperuser
C:\Django\pjt\tempPjt>python manage.py runserver
C:\Django\pjt\tempPjt>python manage.py migrate
TypeScript
복사
04. 데이터베이스(ORM)
테이블 생성
•
tempProject 생성
Microsoft Windows [Version 10.0.19042.1348]
(c) Microsoft Corporation. All rights reserved.
C:\Users\jhe00>cd C:\Django\pjt
C:\Django\pjt>django-admin startingproject tempProject
No Django settings specified.
Unknown command: 'startingproject'. Did you mean startproject?
Type 'django-admin help' for usage.
C:\Django\pjt>django-admin startproject tempProject
C:\Django\pjt>cd tempProject
C:\Django\pjt\tempProject>dir
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 9AEB-3250
C:\Django\pjt\tempProject 디렉터리
2021-11-20 오후 04:03 <DIR> .
2021-11-20 오후 04:03 <DIR> ..
2021-11-20 오후 04:03 689 manage.py
2021-11-20 오후 04:03 <DIR> tempProject
1개 파일 689 바이트
3개 디렉터리 337,288,167,424 바이트 남음
C:\Django\pjt\tempProject>python manage.py startapp students
C:\Django\pjt\tempProject>cd../
C:\Django\pjt>dir
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 9AEB-3250
C:\Django\pjt 디렉터리
2021-11-20 오후 04:03 <DIR> .
2021-11-20 오후 04:03 <DIR> ..
2021-11-20 오전 12:12 <DIR> tempPjt
2021-11-20 오후 04:04 <DIR> tempProject
0개 파일 0 바이트
4개 디렉터리 337,291,419,648 바이트 남음
C:\Django\pjt>move tempPjt tempProject_
1개의 디렉터리를 이동했습니다.
C:\Django\pjt>cd tempProject
C:\Django\pjt\tempProject>dir
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 9AEB-3250
C:\Django\pjt\tempProject 디렉터리
2021-11-20 오후 04:04 <DIR> .
2021-11-20 오후 04:04 <DIR> ..
2021-11-20 오후 04:03 689 manage.py
2021-11-20 오후 04:10 <DIR> students
2021-11-20 오후 04:09 <DIR> tempProject
1개 파일 689 바이트
4개 디렉터리 337,377,005,568 바이트 남음
TypeScript
복사
•
C:\Django\pjt\tempProject>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
C:\Django\pjt\tempProject>python manage.py createsuperuser
Username (leave blank to use 'jhe00'): jhe
Email address: jhe226@korea.ac.kr
Password:
Password (again):
Superuser created successfully.
TypeScript
복사
•
서버 접속 후 확인
Microsoft Windows [Version 10.0.19042.1348]
(c) Microsoft Corporation. All rights reserved.
C:\Users\jhe00>cd C:\Django\pjt\tempProject
C:\Django\pjt\tempProject>dir
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 9AEB-3250
C:\Django\pjt\tempProject 디렉터리
2021-11-20 오후 04:14 <DIR> .
2021-11-20 오후 04:14 <DIR> ..
2021-11-20 오후 04:14 131,072 db.sqlite3
2021-11-20 오후 04:03 689 manage.py
2021-11-20 오후 04:11 <DIR> students
2021-11-20 오후 04:09 <DIR> tempProject
2개 파일 131,761 바이트
4개 디렉터리 337,371,860,992 바이트 남음
C:\Django\pjt\tempProject>python manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...
TypeScript
복사
-127.0.0.1:8000에 접속 및 로그인
•
models.py에 테이블 클래스 정의 후 admin.py에 등록
- student 테이블 생성을 위한 Student 클래스 정의
# models.py
from django.db import models
# Create your models here.
class Student(models.Model):
s_name = models.CharField(max_length=100)
s_major = models.CharField(max_length=100)
s_age = models.IntegerField(default=0)
s_grade = models.IntegerField(default=0)
s_gender = models.CharField(max_length=30)
def __str__(self):
return self.s_name
Python
복사
- admin.py에 Student 등록
# admin.py
from django.contrib import admin
from students.models import Student
# Register your models here.
admin.site.register(Student)
Python
복사
- DB 변경사항 반영
C:\Django\pjt\tempProject>python manage.py makemigrations students
Migrations for 'students':
students\migrations\0001_initial.py
- Create model Student
C:\Django\pjt\tempProject>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, students
Running migrations:
Applying students.0001_initial... OK
TypeScript
복사
(반드시 app이름을 추가해준다)
students 앱과 tempProject내의 tempProject가 동일 선상에 있어야 함!
레코드 다루기(create, read, update, delete)
•
장고 shell 모드 실행
C:\Django\pjt\tempProject>python manage.py shell
Python 3.9.6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
TypeScript
복사
•
레코드 추가(create) - 데이터 생성
>>> from students.models import Student
>>> qs = Student(s_name = 'HongGilDong', s_major = 'computer', s_age = 21, s_grade = 2, s_gender = 'M')
>>> qs.save()
>>> qs = Student(s_name = 'HongGilSoon', s_major = 'dance', s_age = 22, s_grade = 3, s_gender = 'W')
>>> qs.save()
>>> qs = Student(s_name = 'HongGilJa', s_major = 'song', s_age = 23, s_grade = 4, s_gender = 'W')
>>> qs.save()
TypeScript
복사
•
레코드 읽기(read) - 데이터 검색
>>> Student.objects.all()
<QuerySet [<Student: HongGilDong>, <Student: HongGilSoon>, <Student: HongGilJa>]>
>>> qs = Student.objects.all()
>>> print(qs)
<QuerySet [<Student: HongGilDong>, <Student: HongGilSoon>, <Student: HongGilJa>]>
>>> type(qs)
<class 'django.db.models.query.QuerySet'>
>>> qs = Student.objects.get(s_name = 'HongGilDong')
>>> qs
<Student: HongGilDong>
>>> type(qs)
<class 'students.models.Student'>
TypeScript
복사
- 데이터 전체 : QuerySet 타입으로 반환
- 데이터 한 개 : Student 타입으로 반환
•
레코드 읽기(read) - 필드 데이터 검색
>>> qs = Student.objects.all()
>>> qs
<QuerySet [<Student: HongGilDong>, <Student: HongGilSoon>, <Student: HongGilJa>]>
>>> qs[1]
<Student: HongGilSoon>
>>> qs[1].s_name
'HongGilSoon'
>>> qs[1].s_age
22
>>> qs = Student.objects.get(s_name = 'HongGilDong')
>>> qs.s_name
'HongGilDong'
>>> qs.s_age
21
>>> qs.s_major
'computer'
>>>
TypeScript
복사
- 데이터 다수 : 첨자([ ])를 이용한 접근
- 데이터 한 개 : '.'를 이용한 속성 접근
•
레코드 읽기(read) - 데이터 필터(filter)
>>> qs = Student.objects.filter(s_age__lt=22)
>>> qs
<QuerySet [<Student: HongGilDong>]>
>>> qs = Student.objects.filter(s_age__gt=22)
>>> qs
<QuerySet [<Student: Student object (3)>]>
>>> qs = Student.objects.filter(s_age__lte=22)
>>> qs
<QuerySet [<Student: HongGilDong>, <Student: HongGilSoon>]>
>>> qs = Student.objects.filter(s_age__gte=22)
>>> qs
<QuerySet [<Student: HongGilSoon>, <Student: HongGilJa>]>
>>>
TypeScript
복사
__lt | ~보다 작다 |
__lte | ~보다 작거나 같다 |
__gt | ~보다 크다 |
__gte | ~보다 크거나 같다 |
__isnull | ~null인 자료 검색 |
__contains | 특정 문자열을 포함하는 자료 검색 |
__startwith | 특정 문자열로 시작하는 자료 검색 |
__endwith | 특정 문자열로 끝나는 자료 검색 |
•
레코드 읽기(read) - 데이터 정렬
>>> qs = Student.objects.order_by('s_age')
>>> qs
<QuerySet [<Student: HongGilDong>, <Student: HongGilSoon>, <Student: HongGilJa>]>
>>> qs = Student.objects.order_by('-s_age')
>>> qs
<QuerySet [<Student: HongGilJa>, <Student: HongGilSoon>, <Student: HongGilDong>]>
>>>
TypeScript
복사
order_by(' ') | 오름차순 |
order_by('- ') | 내림차순 |
•
레코드 업데이트(update) - 데이터 수정
>>> qs = Student.objects.get(s_name = 'HongGilDong')
>>> qs
<Student: Student object (1)>
>>> qs.s_major = 'mathmatics'
>>> qs.save()
>>> qs.s_major
'mathmatics'
>>>
TypeScript
복사
•
레코드 삭제(delete) - 데이터 삭제
>>> qs = Student.objects.filter(s_age__gte = 22)
>>> qs
<QuerySet [<Student: HongGilSoon>, <Student: HongGilJa>]>
>>> qs.delete()
(2, {'students.Student': 2})
>>>
TypeScript
복사
delete 실행시 바로 데이터를 삭제 ⇒ 쉽게 데이터를 날릴 수 있으므로 유의하기
05. 학사관리프로그램 만들기 - I
웹 애플리케이션 설계
•
설계 단계
URL | view | template | redirection | |
학생등록 | /students/reg | regStudent() | registerStudent.html | |
학생(전체)보기 | regConStudent() | /students/all | ||
학생(전체)보기 | /studnets/all | reaStudentAll() | readStudents.html | |
학생수정 | /students/<strs_name>/mod | reaStudentAll() | modifyStudent.html | |
modConStudent() | reaStudentAll() | |||
학생삭제 | /students/<strs_name>/del | delStudent() | deleteStudent.html |
프로젝트 생성
•
sProject 생성
Microsoft Windows [Version 10.0.19042.1348]
(c) Microsoft Corporation. All rights reserved.
C:\Users\jhe00>cd C:\Django\pjt
C:\Django\pjt>django-admin startproject studentsProject
C:\Django\pjt>dir
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 9AEB-3250
C:\Django\pjt 디렉터리
2021-11-21 오전 07:22 <DIR> .
2021-11-21 오전 07:22 <DIR> ..
2021-11-21 오전 07:22 <DIR> studentsProject
2021-11-20 오전 12:12 <DIR> tempProject_
0개 파일 0 바이트
4개 디렉터리 342,851,301,376 바이트 남음
C:\Django\pjt>move studentsProject sProject
1개의 디렉터리를 이동했습니다.
TypeScript
복사
애플리케이션 생성
•
students 애플리케이션 생성
C:\Django\pjt>cd sProject
C:\Django\pjt\sProject>python manage.py startapp students
TypeScript
복사
프로젝트 설정 변경(settings.py)
•
studentsProject/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'students.apps.StudentsConfig',
]
.
.
.
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Seoul'
Python
복사
데이터베이스 만들기(models.py)
•
students/models.py
from django.db import models
# Create your models here.
class Student(models.Model):
s_name = models.CharField(max_length=100)
s_major = models.CharField(max_length=100)
s_ages = models.IntegerField(default=0)
s_grade = models.IntegerField(default=0)
s_gender = models.CharField(max_length=30)
def __str__(selfself):
return self.s_name
Python
복사
•
students/admin.py
from django.contrib import admin
from students.models import Student
# Register your models here.
admin.site.register(Student)
Python
복사
- admin에 table 적용
•
데이터베이스 반영
C:\Django\pjt\sProject>python manage.py makemigrations students
Migrations for 'students':
students\migrations\0001_initial.py
- Create model Student
C:\Django\pjt\sProject>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, students
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
Applying students.0001_initial... OK
TypeScript
복사
관리자 계정 생성 및 웹서버 실행
•
관리자 계정 생성 및 서버 구동
C:\Django\pjt\sProject>python manage.py createsuperuser
Username (leave blank to use 'jhe00'): jhe226
Email address: jhe226@korea.ac.kr
Password:
Password (again):
Superuser created successfully.
C:\Django\pjt\sProject>python manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
November 21, 2021 - 07:32:40
Django version 3.2.9, using settings 'studentsProject.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CTRL-BREAK.
TypeScript
복사
관리자 페이지 및 Django 인트로(시작) 페이지 접속
•
Django 인트로(시작) 페이지 접속
- 127.0.0.1:8000 접속 → 성공 확인 → 127.0.0.1:8000/admin 접속 → 로그인
06. 학사관리프로그램 만들기 - II
학생 등록 및 리스트 페이지 만들기
•
학생 등록 페이지
•
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('students/', include('students.urls')),
]
Python
복사
•
students/urls.py
from django.urls import path
from . import views
app_name = 'students'
urlpatterns = [
path('reg/', views.regStudent, name = 'reg'),
]
Python
복사
•
views.py
from django.shortcuts import render
# Create your views here.
def regStudent(request):
return render(request, 'students/registerStudent.html')
Python
복사
•
students app 폴더 내부에 template 폴더 생성 ⇒ html 파일 저장
registerStudent.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Title</title>
</head>
<body>
<p>Register Student</p>
<form action="{% url 'students:regCon' %}" method="post">
{% csrf_token %}
name : <input type="text" name="name"></br>
major : <input type="text" name="major"></br>
age : <input type="text" name="age"></br>
grade : <input type="text" name="grade"></br>
gender : <input type="text" name="gender"></br>
<input type="submit" value="Register">
</form>
</body>
</html>
HTML
복사
•
students/views.py
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render
from students.models import Student
# Create your views here.
def regStudent(request):
return render(request, 'students/registerStudent.html')
def regConStudent(request):
name = request.POST['name']
major = request.POST['major']
age = request.POST['age']
grade = request.POST['grade']
gender = request.POST['gender']
qs = Student(s_name=name, s_major=major, s_age=age, s_grade=grade, s_gender=gender)
qs.save()
return HttpResponseRedirect(reverse('students:stuAll'))
Python
복사
- return ⇒ stuAll로 redirect
•
urls.py에 path 연결
from django.urls import path
from . import views
app_name = 'students'
urlpatterns = [
path('reg/', views.regStudent, name = 'reg'),
path('regCon/', views.regConStudent, name = 'regCon'),
path('all/', views.reaStudentAll, name = 'stuAll'),
]
Python
복사
•
students/views.py
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render
from students.models import Student
# Create your views here.
def regStudent(request):
return render(request, 'students/registerStudent.html')
def regConStudent(request):
name = request.POST['name']
major = request.POST['major']
age = request.POST['age']
grade = request.POST['grade']
gender = request.POST['gender']
qs = Student(s_name=name, s_major=major, s_age=age, s_grade=grade, s_gender=gender)
qs.save()
return HttpResponseRedirect(reverse('students:stuAll'))
def reaStudentAll(request):
qs = Student.objects.all()
context = {'student_list': qs}
return render(request, 'students/readStudents.html', context)
Python
복사
- stuAll로 redirct 후 reaStudentAll 함수 생성
•
reaStudents.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-Type" content="text/html"; charset=UTF-8>
<title>Title</title>
</head>
<body>
<p>Read Students</p>
{% if student_list %}
<ol>
{% for s in student_list %}
<li>
<a href="{% url 'students:stuDet' s.s_name %}">{{s.s_name}}</a>
<a href="{% url 'students:stuMod' s.s_name %}">수정</a>
<a href="{% url 'students:stuDel' s.s_name %}">삭제</a>
</li>
{% endfor %}
</ol>
{% else %}
<p>Student: 0</p>
{% endif %}
</br>
<a href="{% url 'students:reg ' %} ">신규학생등록</a>
</body>
</html>
HTML
복사
07. 학사관리프로그램 만들기 - III
학생 정보 보기 페이지 만들기
•
학생 정보 보기 페이지
•
reaStudents.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-Type" content="text/html"; charset=UTF-8>
<title>Title</title>
</head>
<body>
<p>Read Students</p>
{% if student_list %}
<ol>
{% for s in student_list %}
<li>
<a href="{% url 'students:stuDet' s.s_name %}">{{s.s_name}}</a>
<a href="#none">수정</a>
<a href="#none">삭제</a>
</li>
{% endfor %}
</ol>
{% else %}
<p>Student: 0</p>
{% endif %}
</br>
<a href="{% url 'students:reg' %}">신규학생등록</a>
</body>
</html>
HTML
복사
•
students/urls.py
from django.urls import path
from . import views
app_name = 'students'
urlpatterns = [
path('reg/', views.regStudent, name='reg'),
path('regCon/', views.regConStudent, name='regCon'),
path('all/', views.reaStudentAll, name='stuAll'),
path('<str:name>/det/', views.detStudent, name='stuDet'),
]
Python
복사
•
students/views.py
def detStudent(request, name):
qs = Student.objects.get(s_name = name)
context = {'student_info': qs}
return render(request, 'students/detailStudent.html', context)
Python
복사
•
templates/detailStudent.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-Type" content="text/html"; charset=UTF-8>
<title>Title</title>
</head>
<body>
<p>Detail Students</p>
{% if student_info %}
name: {{student_info.s_name}}</br>
major: {{student_info.s_major}}</br>
age: {{student_info.s_age}}</br>
grade: {{student_info.s_grade}}</br>
gender: {{student_info.s_gender}}</br>
{% else %}
<p>student: 0</p>
{% endif%}
</br>
<a href="{% url 'students:stuMod' student_info.s_name %}">수정</a>
<a href="#none">삭제</a>
<a href="{% url 'students:stuAll' %}">학생리스트</a>
<a href="{% url 'students:reg' %}">신규학생등록</a>
</body>
</html>
HTML
복사
학생 정보 수정 페이지 만들기
•
학생 정보 수정 페이지
•
students/url.py
from django.urls import path
from . import views
app_name = 'students'
urlpatterns = [
path('reg/', views.regStudent, name='reg'),
path('regCon/', views.regConStudent, name='regCon'),
path('all/', views.reaStudentAll, name='stuAll'),
path('<str:name>/det/', views.detStudent, name='stuDet'),
path('<str:name>/mod/', views.reaStudentOne, name='stuMod'),
]
Python
복사
•
students/views.py
def reaStudentOne(request, name):
qs = Student.objects.get(s_name = name)
context = {'student_info': qs}
return render(request, 'students/modifyStudent.html', context)
Python
복사
•
templates/modifyStudent.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-Type" content="text/html"; charset=UTF-8>
<title>Title</title>
</head>
<body>
<p>Modify Student</p>
{% if student_info %}
<form action="{% url 'students:modCon' %}" method="post">
{% csrf_token %}
name : {{student_info.s_name}}</br>
<input type="hidden" name="name" value={{student_info.s_name}}></br>
major : <input type="text" name="major" value={{student_info.s_major}}></br>
age : <input type="text" name="age" value={{student_info.s_age}}></br>
grade : <input type="text" name="grade" value={{student_info.s_grade}}></br>
gender : <input type="text" name="gender" value={{student_info.s_gender}}></br>
<input type="submit" name="Modify"></br>
</form>
{% else %}
<p>student: 0</p>
{% endif %}
</body>
</html>
HTML
복사
•
students/url.py
from django.urls import path
from . import views
app_name = 'students'
urlpatterns = [
path('reg/', views.regStudent, name='reg'),
path('regCon/', views.regConStudent, name='regCon'),
path('all/', views.reaStudentAll, name='stuAll'),
path('<str:name>/det/', views.detStudent, name='stuDet'),
path('<str:name>/mod/', views.reaStudentOne, name='stuMod'),
path('modCon/', views.modConStudent, name='modCon'),
]
Python
복사
•
students/views.py
def modConStudent(request):
name = request.POST['name']
major = request.POST['major']
age = request.POST['age']
grade = request.POST['grade']
gender = request.POST['gender']
s_qs = Student.objects.get(s_name=name)
s_qs.s_name = name
s_qs.s_major = major
s_qs.s_age = age
s_qs.s_grade = grade
s_qs.s_gender = gender
s_qs.save()
return HttpResponseRedirect(reverse('students:stuAll'))
Python
복사
•
templates/detailStudent.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-Type" content="text/html"; charset=UTF-8>
<title>Title</title>
</head>
<body>
<p>Detail Students</p>
{% if student_info %}
name: {{student_info.s_name}}</br>
major: {{student_info.s_major}}</br>
age: {{student_info.s_age}}</br>
grade: {{student_info.s_grade}}</br>
gender: {{student_info.s_gender}}</br>
{% else %}
<p>student: 0</p>
{% endif%}
</br>
<a href="{% url 'students:stuMod' student_info.s_name %}">수정</a>
<a href="{% url 'students:stuDel' student_info.s_name %}">삭제</a>
<a href="{% url 'students:stuAll' %}">학생리스트</a>
<a href="{% url 'students:reg' %}">신규학생등록</a>
</body>
</html>
HTML
복사
학생 정보 삭제 기능 만들기
•
학생 정보 삭제 기능
•
students/url.py
from django.urls import path
from . import views
app_name = 'students'
urlpatterns = [
path('reg/', views.regStudent, name='reg'),
path('regCon/', views.regConStudent, name='regCon'),
path('all/', views.reaStudentAll, name='stuAll'),
path('<str:name>/det/', views.detStudent, name='stuDet'),
path('<str:name>/mod/', views.reaStudentOne, name='stuMod'),
path('modCon/', views.modConStudent, name='modCon'),
path('<str:name>/del', views.delConStudent, name='stuDel'),
]
Python
복사
•
students/views.py
def delConStudent(request, name):
qs = Student.objects.get(s_name = name)
qs.delete()
return HttpResponseRedirect(reverse('students:stuAll'))
Python
복사