-
Python Django 17 - table이 존재하는 상황(table 가져오기)Python Django 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>
'Python Django' 카테고리의 다른 글
게시판 예제 - 댓글 (0) 2022.10.23 게시판 예제 (0) 2022.10.23 Python Django 16 - join 복수의 DB 사용(ORM) (0) 2022.10.23 미니방명록 예제 (0) 2022.10.23 Python Django 15 - ORM(DB) 사용 예제(필드 타입 명령) (0) 2022.10.23