ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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}}">&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>

     

     

     

     

    '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

    댓글

Designed by Tistory.