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}}">&laquo;이전</a>
				{% endif %}
				{% if sangpums.has_next %} <!-- 이전 페이지가 있다면 -->
					<a href="/sangpum/list?page={{sangpums.next_page_number}}">다음&raquo;</a>
				{% endif %}
				&nbsp;&nbsp;
				(페이지:{{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>