Python Django
Python Django 17 - table이 존재하는 상황(table 가져오기)
코딩탕탕
2022. 10. 23. 15:06

cmd에 들어와서 프로젝트 경로를 입력 후 python manage.py inspectdb > abc.py(파일명 아무거나) 를 적으면 abc.py 파일이 생기면서 table이 담긴다. 해당 table 코드를 models.py에 붙여놓기 하면 된다.
models.py
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'
urls.py
from django.contrib import admin
from django.urls import path
from mysangpum import views
urlpatterns = [
path("admin/", admin.site.urls),
path("", views.MainFunc),
]
views.py
from django.shortcuts import render
import MySQLdb
from mysangpum.models import Sangdata
from django.http.response import HttpResponseRedirect
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
config = {
'host':'127.0.0.1',
'user':'root',
'password':'123',
'database':'test',
'port':3306,
'charset':'utf8',
'use_unicode':True
}
# Create your views here.
def MainFunc(request):
return render(request, 'main.html')
def ListFunc(request):
#SQL문 직접 사용
'''
sql="select * from sangdata"
conn=MySQLdb.connect(**config) # ** dict 타입
cursor = conn.cursor()
cursor.execute(sql)
datas=cursor.fetchall()
datas=cursor.fetchall()
print(datas, type(datas))
'''
'''
datas=Sangdata.objects.all() # ORM 반환형 QuerySet
return render(request, 'list.html',{'sangpums':datas})
'''
#페이지 나누기
datas=Sangdata.objects.all().order_by('-code')
paginator=Paginator(datas, 5) #page당 3행씩 출력, 페이지 갯수를 여기서 수정할 수 있다.
try:
page=request.GET.get('page') #겟 방식
except:
page= 1
try:
data=paginator.page(page) # page에 해당되는 자료를 읽기
except PageNotAnInteger: #페이지를 숫자값으로 안주는 이런 에러가 떨어지면,
data=paginator.page(1) #무조건 1로 전달한다
except EmptyPage:
data=paginator.page(paginator.num_pages())
#낱개 페이지 번호를 출력한다면...
allpage=range(paginator.num_pages + 1) # (0,5)
return render(request, 'list2.html', {'sangpums':data, 'allpage':allpage})
#낱개 페이지를 출력하기 위해 allpage를 같이 보낸다
def InsertFunc(request):
return render(request, 'insert.html')
def InsertOkFunc(request):
if request.method=='POST': #포스트 방식으로 넘어오는 것만
#신상품 code 등록 여부 판단
try:
Sangdata.objects.get(code=request.POST.get('code'))
return render(request, 'insert.html', {'msg':'이미 등록된 code입니다.'})
except Exception as e:
#입력 자료의 code가 등록된 숫자가 아니므로 insert 작업을 진행
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")
def UpdateFunc(request): # 하나의 칼럼만 읽어온다.
data = Sangdata.objects.get(code=request.GET.get('code'))
return render(request, 'update.html', {'sang_one':data})
def UpdateOkFunc(request):
# post타입으로 받아온 값들을 각각 칼럼에 넣어주고, save(수정) 한다.
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") # 수정 후 목록보기
def DeleteFunc(request):
# 코드를 가져와서 delete 함수로 삭제시킨다.
delRec = Sangdata.objects.get(code=request.GET.get('code'))
delRec.delete()
return HttpResponseRedirect("/sangpum/list") # 삭제 후 목록보기
db 값을 가져와서 insert, update, delete, select 할 수 있다.
main.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>메인 페이지</p>
직원 고객 부서 <a href="sangpum/list">상품</a>
</body>
</html>
list.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>** 상품 정보 **</p>
<div style="width:80%; text-align:right;">
<a href="/sangpum/insert">상품 추가</a>
</div>
<table border="1" style="width:80%">
<tr style="background-color:cyan">
<th>코드</th>
<th>상품명</th>
<th>수량</th>
<th>단가</th>
<th>기타</th>
</tr>
{% if sangpums %}
{% for s in sangpums %}
<tr> <!-- select문의 결과를 출력할 때는 tuple 이므로 s.0,... 사용 -->
<td style="text-align: center;">{{s.code}}</td>
<td style="text-align: center;">{{s.sang}}</td>
<td style="text-align: center;">{{s.su}}</td>
<td style="text-align: center;">{{s.dan}}</td>
<td style="text-align: center;">
<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>
sql문을 사용하려면 반환형이 tuple 타입이므로 {{s.code}},{{s.sang}} 이런식이 아닌 {{s.0}}, {{s.1}} 이런식으로 적어야 된다.
반면, ORM형식으로 사용하면 반환형이 queryset 타입이므로 {{s.code}},{{s.sang}}게 나타낼 수 있다.
구분을 잘 해야된다.
list2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
function func(arg){
// alert(args);
let result = confirm("정말 삭제하시겠습니까?");
if(result){
document.getElementById(arg).submit();
}
}
</script>
</head>
<body>
<p>** 상품 정보 **</p>
<div style="width:80%; text-align:right;">
<a href="/sangpum/insert">상품 추가</a>
</div>
<table border="1" style="width:80%">
<tr style="background-color:cyan">
<th>코드</th>
<th>상품명</th>
<th>수량</th>
<th>단가</th>
<th>기타</th>
</tr>
{% if sangpums %}
{% for s in sangpums %}
<tr> <!-- select문의 결과를 출력할 때는 tuple 이므로 s.0,... 사용 -->
<td style="text-align: center;">{{s.code}}</td>
<td style="text-align: center;">{{s.sang}}</td>
<td style="text-align: center;">{{s.su}}</td>
<td style="text-align: center;">{{s.dan}}</td>
<td style="text-align: center;">
<a href="/sangpum/update?code={{s.code}}">수정</a> /
<!-- a태그 대신에 javascript로 삭제하기
<a href="/sangpum/delete?code={{s.code}}">삭제</a> /
-->
<form action="/sangpum/delete" name="frm" method="get" id="{{s.code}}" style="display: inline">
<input type="hidden" name="code" value="{{s.code}}"/>
<a href="javascript:void(0); onclick=func({{s.code}})">삭제</a>
</form>
</td>
</tr>
{% endfor %}
<!-- 페이징 처리 -->
<tr>
<td colspan="5">
{% if sangpums.paginator.num_pages > 1 %}
<div>
{% if sangpums.has_previous %} <!-- 이전 페이지가 있다면 -->
<a href="/sangpum/list?page={{sangpums.previous_page_number}}">«이전</a>
{% endif %}
{% if sangpums.has_next %} <!-- 이전 페이지가 있다면 -->
<a href="/sangpum/list?page={{sangpums.next_page_number}}">다음»</a>
{% endif %}
(페이지:{{sangpums.number}} / {{sangpums.paginator.num_pages}})
<hr> <!-- 숫자가 나오도록 페이징 처리 -->
{% for p in allpage %}
{% if p > 0 %}
{% if p == sangpums.number %} <!-- 현재 페이지는 링크를 걸지 않는다. -->
{{p}}
{% else %}
<a href="/sangpum/list?page={{p}}">{{p}}</a>
{% endif %}
{% endif %}
{% endfor %}
</div>
{% endif %}
</td>
</tr>
{% else %}
<tr>
<td colspan="5">자료 없음</td>
</tr>
{% endif %}
</table>
</body>
</html>
페이징 처리를 하였다. 2개의 경우가 있으며 위에 코드를 보면 해석이 가능하다.
insert.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
</script>
</head>
<body>
<h3>* 상품 추가 *</h3>
<form action="/sangpum/insertok" name="frm" method="post">{% csrf_token %}
<table style="width: 90%;">
<tr>
<td>코드 : </td>
<td><input type="text" name="code"/></td>
</tr>
<tr>
<td>품명 : </td>
<td><input type="text" name="sang"/></td>
</tr>
<tr>
<td>수량 : </td>
<td><input type="text" name="su"/></td>
</tr>
<tr>
<td>단가 : </td>
<td><input type="text" name="dan"/></td>
</tr>
<tr>
<td colspan="2">
<input type="button" value="저장" id="btnSubmit"/>
</td>
</tr>
</table>
</form>
</body>
</html>


