📢 공지사항
home
💻

Django 2

상태
정하은
배정
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
복사
python manage.py migrate 한 후 관리자 계정 생성
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
복사
초기 앱 생성시 python mange.py makemigrations app이름
(반드시 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
학생 등록 및 리스트 페이지 만들기
학생 등록 페이지
urls.py에 path 연결 ⇒ views,py 작성 ⇒ template 작성 ⇒ ...
sProject/urls.py ⇒ app에 파일 복사 ->연결
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
복사