5. sqlite
6. where, group by
7. 원격 DB
8. DB - ForeignKey
9. DB - CRUD, 페이징
10. 게시판
5. sqlite
: 장고의 ORM(Object Relational Mapping) 사용하여 내장 함수로 DB의 DML, DDL .. 등을 실행.
= django_test04_sqlite
* settings
INSTALLED_APPS = [
...
'sqlapp',
]
* url
from django.contrib import admin
from django.urls import path
from sqlapp import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.Main),
path('show/', views.DbTestFunc),
]
path('admin/', admin.site.urls) : admin 요청명 admin.py와 연결
* models : db table 작성
from django.db import models
# Create your models here.
# ORM
# 논리적인 테이블 설정
class Article(models.Model):
code = models.CharField(max_length=10)
name = models.CharField(max_length=20)
price = models.IntegerField()
pub_date = models.DateTimeField()
class 테이블명(models.Model) : 테이블 생성
column명 = models.CharField(maxlength= ) : 문자타입 칼럼 생성.
column명 = models.IntegerField() : 숫자타입 칼럼 생성.
column명 = models.DateTimeField() : 날짜타입 칼럼 생성.
explore 창 - 프로젝트 오른쪽 클릭 - Django - Make Migrations - sqlapp
explore 창 - 프로젝트 오른쪽 클릭 - Django - Migrate
* admin계정 id 생성
- anconda prompt 창 실행
cd C:\work\psou\django_test04_sqlite
python manage.py createsuperuser
=> id / e-mail / password 설정
- http://127.0.0.1/admin/ 접속 후 login
- table data 입력
* admin
from django.contrib import admin
from sqlapp.models import Article
# Register your models here.
class ArticleAdmin(admin.ModelAdmin):
list_display = ('id', 'code', 'name', 'price', 'pub_date')
admin.site.register(Article, ArticleAdmin)
class 클래스명(admin.ModelAdmin):
list_display = ('칼럼명1', ... )
admin.site.register(테이블명, 클래스명)
=> 테이블과 admin계정 연결
* views
from django.shortcuts import render
from sqlapp.models import Article
# Create your views here.
def Main(request):
return render(request, "main.html")
def DbTestFunc(request):
datas = Article.objects.all() # 장고의 ORM. select * from Article 이 내부적으로 수행. list 타입으로 리턴.
#print(datas) # <QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <Article: Article object (3)>]>
#print(datas[0].name) # 아아
return render(request, 'list.html',{'articles':datas}) # QuerySet을 전달.
models.py의 클래스명.objects.all() : select * from 테이블명(클래스명)
* main.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>메인</h2>
<a href="show/">자료 보기</a>
</body>
</html>
* list.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Article 자료 보기 - Djang template language 사용 <br>
{% if articles.count %}
{% for a in articles %}
<b>{{a.code}}</b> {{a.name}} {{a.price}} {{a.pub_date}}<br>
{% endfor %}
{% else %}
<p>자료가 없습니다.</p>
{% endif %}
</body>
</html>
{% if 조건 %}
{% else %}
{% endif %}
=> if 문
{% for 변수 in 자료 %}
{% endfor %}
=> for 문
6. where, group by
* settings
INSTALLED_APPS = [
...
'sql_app',
]
=> application연결
* models
from django.db import models
# Create your models here.
class Profile(models.Model):
name = models.CharField(max_length = 10)
age = models.IntegerField()
=> DB 테이블 생성
- explore 창 - 프로젝트 오른쪽 클릭 - Django - Create application - sqlapp
- explore 창 - 프로젝트 오른쪽 클릭 - Django - Make Migrations - sqlapp
- explore 창 - 프로젝트 오른쪽 클릭 - Django - Migrate
해당 프로젝트 cmd 창 : python manage.py createsuperuser
* admin
from django.contrib import admin
from sql_app.models import Profile
# Register your models here.
class ProfileAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'age')
admin.site.register(Profile, ProfileAdmin)
=> 테이블과 admin 계정 연결.
- http://127.0.0.1/admin/ 접속 후 login
- table data 입력
* urls
from django.contrib import admin
from django.urls import path
from sql_app import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.IndexFunc),
path('calldata/', views.CallFunc),
]
=> url과 views 연결
* views
from django.shortcuts import render
from sql_app.models import Profile
from django.db.models.aggregates import Avg, Count, Max, Min, Sum
# Create your views here.
def IndexFunc(request):
return render(request, 'index.html')
def CallFunc(request):
profile_list = Profile.objects.all() # 전체 자료 list로 리턴
for row in profile_list.values_list(): # 리스트의 값들 리턴
print(row)
print(Profile.objects.aggregate(Avg('age'))) # select avg(age) from Profile
print(Profile.objects.aggregate(Max('age')))
print(Profile.objects.aggregate(Sum('age')))
print(Profile.objects.aggregate(Count('age')))
print(len(profile_list))
print(Profile.objects.filter(name = '홍길동').aggregate(Avg('age'))) # where 조건
qs = Profile.objects.values('name').annotate(Avg('age')) # group 별 작업
for r in qs:
print(r)
pro_list = []
for pro in profile_list:
pro_dict ={}
pro_dict['name'] = pro.name
pro_dict['age'] = pro.age
pro_list.append(pro_dict)
print(pro_list)
# [{'key1':value1, 'key2':value2, ... }, {'key1':value1, 'key2':value2, ... }, ... ]
context = {'pro_list':pro_list}
return render(request, 'list.html', context)
QuerySet 타입.values_list() : value list 리턴
테이블명.objects.aggregate(Avg('칼럼명')) : select avg(칼럼명) from 테이블명
테이블명.objects.aggregate(Max('칼럼명')) : select max(칼럼명) from 테이블명
테이블명.objects.aggregate(Sum('칼럼명')) : select sum(칼럼명) from 테이블명
테이블명.objects.aggregate(Count('칼럼명')) : select count(칼럼명) from 테이블명
테이블명.objects.filter(칼럼명=값) : select * from 테이블명 where 칼럼명 = 값
테이블명.objects.values('칼럼명').annotate(Avg('칼럼명')) : select avg(칼럼명) from 테이블명 group by 칼럼명
* index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
메인(QuerySet Test)<br>
<a href="calldata/">db 자료를 읽어 dict type으로 출력</a>
<br>
<a href="admin/">장고가 지원하는 관리자 창</a>
</body>
</html>
* list.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
자료 보기</p>
{{pro_list}}
</body>
</html>
7. 원격 DB
= django_test06_mariadb
DB 접속하여 DataBase 생성
explore 창 - 프로젝트 오른쪽 클릭 - Django - Create application - myguset
* settings
INSTALLED_APPS = [
...
'myguest',
]
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'yourdb', # DB명 : db는 미리 작성되어 있어야 함.
'USER': 'root', # 계정명
'PASSWORD': '123', # 계정 암호
'HOST': '127.0.0.1', # DB가 설치된 컴의 ip
'PORT': '3306', # DBMS의 port 번호
}
}
DATABASES = {
'default': {
django.db.backends.mysql',
'NAME': 'database명', # DB명 : db는 미리 작성되어 있어야 함.
'USER': 'root', # 계정명
'PASSWORD': '123', # 계정 암호
'HOST': '127.0.0.1', # DB가 설치된 pc의 ip
'PORT': '3306', # DBMS의 port 번호
}
}
=> remote DB 연결 정보.
* models
from django.db import models
# Create your models here.
class Guest(models.Model):
myno = models.AutoField(auto_created = True, primary_key = True)
title = models.CharField(max_length=50)
content = models.TextField()
regdate = models.DateTimeField()
def __str__(self):
return self.title
class Meta:
ordering = ('-title', 'id') # title이 같으면 id로 정렬
ordering = ('-id',) # tuple 타입만 가능.
칼럼명 = models.AutoField(auto_created = True, primary_key = True) : 자동 증가하는 index 기본키 생성.
칼럼명 = models.TextField() : text타입 칼럼 생성
class Meta:
ordering = ('-칼럼명1', '칼럼명2')
=> 칼럼명1 기준 desc 정렬 후 데이터가 같은 정보에 대해 칼럼명2 기준 asc정렬.
- explore 창 - 프로젝트 오른쪽 클릭 - Django - Make Migrations - myguset
- explore 창 - 프로젝트 오른쪽 클릭 - Django - Migrate
* admin
from django.contrib import admin
from myguest.models import Guest
# Register your models here.
class GuestAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'content', 'regdate')
admin.site.register(Guest, GuestAdmin)
=> 테이블과 admin계정 연결.
* admin계정 id 생성 및 table data 입력
* urls(django_test06_mariadb)
from django.contrib import admin
from django.urls import path
from myguest import views
from django.urls.conf import include
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.MainFunc),
path('guest/', include("myguest.urls")),
]
=> url과 views 연결
* urls(myguest)
from django.urls import path
from myguest import views
urlpatterns = [
path('', views.ListFunc),
path('insert', views.InsertFunc),
path('insertok/', views.InsertOkFunc),
]
=> url과 views 연결
* views
from django.shortcuts import render
from myguest.models import Guest
from datetime import datetime
from django.http.response import HttpResponseRedirect
# Create your views here.
def MainFunc(request):
return render(request, 'main.html')
def ListFunc(request):
gdata = Guest.objects.all() # 전체 자료 읽기
gdata = Guest.objects.all().order_by('title') # order_by ascending
gdata = Guest.objects.all().order_by('-title') # order_by descending
gdata = Guest.objects.all().order_by('-id')[0:2] # 정렬 후 슬라이싱
print('gdata type : ', type(gdata)) # <class 'django.db.models.query.QuerySet'>
return render(request, 'list.html', {'gdatas' : gdata})
def InsertFunc(request):
return render(request, 'insert.html')
def InsertOkFunc(request):
if request.method =='POST':
print(request.POST.get('title'))
print(request.POST['title'])
# 입력자료로 테이블에 저장 : ORM
Guest(
title = request.POST.get('title'),
content = request.POST.get('content'),
regdate = datetime.now()
).save()
return HttpResponseRedirect('/guest') # 추가후 목록 보기
'''
# 수정
g = Guest.objects.get(id=1)
g.title = "하하"
g.content = '하하하'
g.save()
# 삭제
g = Guest.objects.get(id=1)
g.delete
'''
테이블명.objects.all().order_by('칼럼명') : order by 칼럼명 asc
테이블명.objects.all().order_by('-칼럼명') : order by 칼럼명 desc
- insert
테이블명(
변수명 = request.POST.get('칼럼명'),
...
변수명 = datetime.now()
).save()
- update
temp = 테이블명.objects.get(조건)
temp.칼럼명 = "수정값"
temp.save()
- delete
temp = 테이블명.objects.get(조건)
temp.delete()
* main.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>메인</h2>
<a href="guest/">미니 방명록 보기</a>
</body>
</html>
* list.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>글 목록</h2>
<a href="/guest/insert">자료 추가</a>
<table border="1">
<tr>
<th>아이디</th><th>제목</th><th>내용</th><th>등록일</th>
</tr>
{% if gdatas %}
{% for g in gdatas %}
<tr>
<td>{{g.id}}</td>
<td>{{g.title}}</td>
<td>{{g.content}}</td>
<td>{{g.regdate}}</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td colspan ="4">자료가 없습니다.</td>
</tr>
{% endif %}
</table>
</body>
</html>
* insert.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>방명록 글 입력</h2>
<form action="/guest/insertok/" method="post">{% csrf_token %}
<table>
<tr>
<td>제목</td>
<td><input type="text" name="title" size="48"/></td>
</tr>
<tr>
<td>내용</td>
<td><textarea rows="5" cols="50" name="content"></textarea></td>
</tr>
<tr>
<td colspan="2" style="text-align: center;"><input type="submit" value="등록" /></td>
</tr>
</table>
</form>
</body>
</html>
8. DB - ForeignKey
= django_test07
Django - create application - sangpumapp
* settings
INSTALLED_APPS = [
...
'sangpumapp',
]
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'sanpumdb', # DB명 : db는 미리 작성되어 있어야 함.
'USER': 'root', # 계정명
'PASSWORD': '123', # 계정 암호
'HOST': '127.0.0.1', # DB가 설치된 컴의 ip
'PORT': '3306', # DBMS의 port 번호
}
}
=> application 연결 및 dataBase 연결 설정.
* models
from django.db import models
# Create your models here.
class Maker(models.Model):
mname = models.CharField(max_length=10)
tel = models.CharField(max_length=20)
addr = models.CharField(max_length=50)
class Meta:
ordering = ('-id',)
def __str__(self):
return self.mname
class Product(models.Model):
pname = models.CharField(max_length=50)
price = models.IntegerField()
maker_name = models.ForeignKey(Maker, on_delete = models.CASCADE) # Maker table의 id와 연결
칼럼명 = models.ForeignKey(연결할 테이블명, on_delete = models.CASCADE) : 다른 테이블의 id를 Foreign Key로 사용
Django - make migrations - sangpumapp
Django - migrate
anaconda 접속 - cd C:\work\psou\django_test07 - python manage.py createsuperuser
* admin
from django.contrib import admin
from sangpumapp.models import Maker, Product
# Register your models here.
class MakerAdmin(admin.ModelAdmin):
list_display =('id', 'mname', 'tel', 'addr')
admin.site.register(Maker, MakerAdmin)
class ProductAdmin(admin.ModelAdmin):
list_display =('id', 'pname', 'price', 'maker_name')
admin.site.register(Product, ProductAdmin)
=> 테이블에 admin 계정 연결.
http://127.0.0.1/admin/ 접속
Maker/Product table에 data 추가
* urls
from django.contrib import admin
from django.urls import path
from sangpumapp import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.Main),
path('list1', views.List1), # maker
path('list2', views.List2), # product
path('list3', views.List3), # list1 -> list2
]
=> url과 views 연결.
* views
from django.shortcuts import render
from sangpumapp.models import Maker, Product
# Create your views here.
def Main(request):
return render(request, 'main.html')
def List1(request):
makers = Maker.objects.all() # select
return render(request, 'list1.html', {'makers':makers})
def List2(request):
products = Product.objects.all() # select
pcount = len(products)
return render(request, 'list2.html', {'products':products, 'pcount':pcount})
def List3(request):
mid = request.GET.get("id")
products = Product.objects.all().filter(maker_name = mid)
pcount = len(products)
return render(request, 'list2.html',{'products':products, 'pcount':pcount})
변수1 = request.GET.get("key값")
테이블1.objects.all().filter(칼럼1 = 변수1) : 테이블1의 칼럼1에서 key의 value와 동일값의 list 출력.
* main.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>메인화면</h2>
<ul>
<li><a href="list1">상품 제조사 보기</a></li>
<li><a href="list2">상품 목록 보기</a></li>
<li>묻고 답하기</li>
</ul>
</body>
</html>
* list1.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>제조사 목록</h2>
<table border="1">
<tr>
<th>아이디</th><th>제조사</th><th>전화번호</th><th>주소</th>
</tr>
{% if makers %}
{% for m in makers %}
<tr>
<td>{{m.id}}</td>
<td><a href="list3?id={{m.id}}">{{m.mname}}</a></td>
<td>{{m.tel}}</td>
<td>{{m.addr}}</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td colspan="4">자료가 없습니다.</td>
</tr>
{% endif %}
</table>
</body>
</html>
* list2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>상품 목록</h2>
<table border="1">
<tr>
<th>아이디</th><th>상품명</th><th>가격</th><th>제조사</th>
</tr>
{% if products %}
{% for p in products %}
<tr>
<td>{{p.id}}</td>
<td>{{p.pname}}</td>
<td>{{p.price}}</td>
<td>{{p.maker_name}}</td>
</tr>
{% endfor %}
<tr>
<td colspan="4">건수{{pcount}}</td>
<tr>
{% else %}
<tr>
<td colspan="4">자료가 없습니다.</td>
</tr>
{% endif %}
</table>
</body>
</html>
9. DB - CRUD, 페이징
① 메인 페이지
= django_test08_sangdata
* settings
...
INSTALLED_APPS = [
...
'mysangpum',
]
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test', # DB명 : db는 미리 작성되어 있어야 함.
'USER': 'root', # 계정명
'PASSWORD': '123', # 계정 암호
'HOST': '127.0.0.1', # DB가 설치된 컴의 ip
'PORT': '3306', # DBMS의 port 번호
}
}
...
TIME_ZONE = 'Asia/Seoul'
USE_TZ = False
TIME_ZONE = 'Asia/Seoul'
USE_TZ = False
=> admin 페이지에 표시되는 시간은 기본적으로 UTC(UTC+9)이므로, 입력을 해도 9시간 전으로 표시된다.
이에 표시되는 시간과 실제 DB에 입력되는 시간을 모두 Local시간(UTC)으로 맞춰 주어야 한다
* remote DB의 데이터를 Django 형식으로 불러오기
anconda 접속
cd C:\work\psou\django_test08_sangdata
python manage.py inspectdb > abc.py
=> 이미 생성되어 있는 DB를 django 형식으로 abc.py에 코드 자동 작성.
* models
from django.db import models
# Create your models here.
class Sangdata(models.Model):
code = models.IntegerField(primary_key=True)
sang = models.CharField(max_length=20, blank=True, null=True)
su = models.IntegerField(blank=True, null=True)
dan = models.IntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'sangdata'
=> abc.py의 sangdata table 내용 입력
- Django - Make migrations - mysangpum
- Django - Migrate
* urls(django_test08_sangdata)
from django.contrib import admin
from django.urls import path
from mysangpum import views
from django.urls.conf import include
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.MainFunc),
path('sangpum/', include('mysangpum.urls')), # 요청 위임
]
=> url과 views 연결.
* views
def MainFunc(request):
return render(request, 'main.html')
* main.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>메인</h2>
<a href="sangpum/list">상품보기(MariaDB)</a>
</body>
</html>
② list 출력
* urls(mysangpum)
from django.urls import path
from mysangpum import views
urlpatterns = [
path('list', views.ListFunc),
path('insert', views.InsertFunc),
path('insertok', views.InsertokFunc),
path('update', views.UpdateFunc),
path('updateok', views.UpdateokFunc),
path('delete', views.DeleteFunc),
]
=> url, views 연결
* views
def ListFunc(request):
#SQL 직접사용해 보기
conn = MySQLdb.connect(**config)
sql = 'select * from sangdata'
cursor = conn.cursor()
cursor.execute(sql)
datas = cursor.fetchall()
print(type(datas)) # tuple
# Django ORM
datas = Sangdata.objects.all()
return render(request, 'list.html', {'sangpums':datas})
...
* list.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h2>상품자료</h2>
<div style="width:80%; text-align:right;">
<a href="/sangpum/insert">상품 추가</a>
</div>
<table class="table" style="width:80%;">
<tr>
<th>code</th><th>상품</th><th>수량</th><th>단가</th><th>기타</th>
</tr>
{% if sangpums %}
{% for s in sangpums%}
<tr>
<!-- <td>{{s.0}}</td> -->
<td>{{s.code}}</td>
<td>{{s.sang}}</td>
<td>{{s.su}}</td>
<td>{{s.dan}}</td>
<td>
<a href="/sangpum/update?code={{s.code}}">수정</a> /
<a href="/sangpum/delete?code={{s.code}}">삭제</a>
</td>
</tr>
{% endfor%}
{% else %}
<tr>
<td colspan="5">자료가 없습니다.</td>
</tr>
{% endif%}
</table>
</body>
</html>
③ 페이징 처리
* views
def ListFunc(request):
...
# 페이지 나누기 처리 - Paginator 클래스
datas = Sangdata.objects.all().order_by('-code') # order by code desc
paginator = Paginator(datas, 3) # 페이지당 출력 행수를 생성자로 전달
try:
page = request.GET.get('page') # page 값을 read
except:
page = 1 # page 값이 없을 경우 1 page 출력
try:
data = paginator.page(page)
except PageNotAnInteger: # page가 숫자가 아닐 경우
data = paginator.page(1)
except EmptyPage:
data = paginator.page(paginator.num_pages()) # 현재 페이지 출력
# 클라이언트 화면에 개별 페이지 번호 표시용
allPage = range(paginator.num_pages + 1)
#print('allPage : ', allPage) # range(0, 5)
return render(request, 'list2.html', {'sangpums':data, 'allPage':allPage})
paginator = Paginator(데이터, 출력행수) : 객체 생성. 페이지당 출력 행수를 생성자로 전달
paginator.page(출력페이지) : 나눠진 페이지에서 출력할 페이지 입력.
paginator.num_pages : 총페이지 수
* list2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<script type="text/javascript">
function func(){
//alert("aa");
let result = confirm("정말 삭제 할까요?")
if(result){
frm.submit();
}
}
</script>
</head>
<body>
<h2>상품자료</h2>
<div style="width:80%; text-align:right;">
<a href="/sangpum/insert">상품 추가</a>
</div>
<table class="table" style="width:80%;">
<tr>
<th>code</th><th>상품</th><th>수량</th><th>단가</th><th>기타</th>
</tr>
{% if sangpums %}
{% for s in sangpums%}
<tr>
<!-- <td>{{s.0}}</td> -->
<td>{{s.code}}</td>
<td>{{s.sang}}</td>
<td>{{s.su}}</td>
<td>{{s.dan}}</td>
<td>
<a href="/sangpum/update?code={{s.code}}">수정</a> /
<!-- 삭제 전에 묻는 작업이 필요 -->
<form action="/sangpum/delete" name="frm" method="get" style="display:inline;">
<input type="hidden" name="code" value="{{s.code}}">
<a href="javascript:void(0); onclick=func()">삭제</a>
</form>
</td>
</tr>
{% endfor%}
<!-- paging -->
<tr>
<td colspan="5">
{% if sangpums.paginator.num_pages > 1 %}
<ul class="pager">
{% if sangpums.has_previous %}
<li class="previous"><a href="/sangpum/list?page={{sangpums.previous_page_number}}">Previous</a></li>
<!-- <li><a href="/sangpum/list?page={{sangpums.previous_page_number}}">«이전</a></li> -->
{% endif %}
{% if sangpums.has_next %}
<li class="next"><a href="/sangpum/list?page={{sangpums.next_page_number}}">Next</a></li>
<!-- <li><a href="/sangpum/list?page={{sangpums.next_page_number}}">다음»</a></li> -->
{% endif %}
<li>(페이지 : {{sangpums.number}} / {{sangpums.paginator.num_pages}})</li>
</ul>
<hr>
{% for p in allPage%}
{% if p > 0 %}
{% if p == sangpums.number %}
[{{p}}]
{% elif p != sangpums.number %}
<a href="/sangpum/list?page={{p}}]"> {{p}} </a>
{% endif %}
{% endif %}
{% endfor%}
{% endif %}
</td>
</tr>
{% else %}
<tr>
<td colspan="5">자료가 없습니다.</td>
</tr>
{% endif%}
</table>
</body>
</html>
data.number : 현재페이지
data.paginator.num_pages : 총 페이지
④ 게시물 추가
* views
def InsertFunc(request):
return render(request, 'insert.html')
def InsertokFunc(request):
if request.method == 'POST':
code = request.POST.get("code")
#print('code : ', code)
# 새로운 상품 code 유무 검증 작업 후 insert 진행
try:
Sangdata.objects.get(code=code) # where
#print('code 있음')
return render(request, 'insert.html', {'msg':'이미 등록된 번호입니다.'})
except Exception as e:
#print('code 없음')
Sangdata(
code = request.POST.get("code"),
sang = request.POST.get("sang"),
su = request.POST.get("su"),
dan = request.POST.get("dan"),
).save()
return HttpResponseRedirect('/sangpum/list') # 추가 후 목록 보기
* insert.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<script type="text/javascript">
window.onload = function(){
document.getElementById("btnSummit").onclick = function(){
chkData()
}
}
function chkData(){
//alert('a');
if(frm.code.value === "" | frm.sang.value === ""){ // 입력자료 오류 검사
alert("입력자료를 모두 채우시오.")
return;
}
frm.submit();
}
</script>
</head>
<body>
<h2>상품 추가</h2>
<form action="/sangpum/insertok" method="post" name="frm">{% csrf_token %}
<table class="table" style="width:80%;">
<tr>
<td>코드 : </td>
<td><input class="form-control" type="text" name="code"/>{{msg}}</td>
</tr>
<tr>
<td>품명 : </td>
<td><input class="form-control" type="text" name="sang"/></td>
</tr>
<tr>
<td>수량 : </td>
<td><input class="form-control" type="text" name="su"/></td>
</tr>
<tr>
<td>단가 : </td>
<td><input class="form-control" type="text" name="dan"/></td>
</tr>
<tr>
<td colspan="4">
<input class="btn-primary" type="button" value="저장" id="btnSummit">
</td>
</tr>
</table>
</form>
</body>
</html>
⑤ 게시물 수정
* views
def UpdateFunc(request):
data = Sangdata.objects.get(code = request.GET.get('code'))
return render(request, 'update.html', {'sang_one':data})
def UpdateokFunc(request):
if request.method == 'POST':
upRec = Sangdata.objects.get(code=request.POST.get('code'))
upRec.code = request.POST.get('code')
upRec.sang = request.POST.get('sang')
upRec.su = request.POST.get('su')
upRec.dan = request.POST.get('dan')
upRec.save()
return HttpResponseRedirect('/sangpum/list') # 수정 후 목록 보기
* update.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h2>상품 수정</h2>
<form action="/sangpum/updateok" method="post">{% csrf_token %}
<table class="table" style="width:80%;">
<tr>
<td>코드 : </td>
<td>
{{sang_one.code}}
<input class="form-control" type="hidden" name="code" value="{{sang_one.code}}"/>
</td>
</tr>
<tr>
<td>품명 : </td>
<td><input class="form-control" type="text" name="sang" value="{{sang_one.sang}}"/></td>
</tr>
<tr>
<td>수량 : </td>
<td><input class="form-control" type="text" name="su" value="{{sang_one.su}}"/></td>
</tr>
<tr>
<td>단가 : </td>
<td><input class="form-control" type="text" name="dan" value="{{sang_one.dan}}"/></td>
</tr>
<tr>
<td colspan="4">
<input class="btn-primary" type="submit" value="수정">
<input type="button" value="이전화면" onclick="history.back()">
</td>
</tr>
</table>
</form>
</body>
</html>
⑥ 게시물 삭제
* views
def DeleteFunc(request):
delRec = Sangdata.objects.get(code=request.GET.get('code'))
delRec.delete()
return HttpResponseRedirect('/sangpum/list') # 삭제 후 목록 보기
10. 게시판
= django_test09_board
'BACK END > Django' 카테고리의 다른 글
[Django] 장고 정리 3 - Ajax, Ajax + DB, Join (0) | 2021.02.22 |
---|---|
[Django] 장고 정리 1 - 환경구축, 외부파일 사용하기, url 연결, session (0) | 2021.02.18 |