Python Django

예제(table 가져와서 join해서 결과 나타내기)

코딩탕탕 2022. 10. 23. 15:33

 

 

urls.py

from django.contrib import admin
from django.urls import path
from myapp import views

urlpatterns = [
    path("admin/", admin.site.urls),
    
    path("", views.main),  
    path("show", views.show), 
]

Function views 방법을 사용하였다.

 

 

models.py

from django.db import models

# Create your models here.
class Gogek(models.Model):
    gogek_no = models.IntegerField(primary_key=True)
    gogek_name = models.CharField(max_length=10)
    gogek_tel = models.CharField(max_length=20, blank=True, null=True)
    gogek_jumin = models.CharField(max_length=14, blank=True, null=True)
    gogek_damsano = models.ForeignKey('Jikwon', models.DO_NOTHING, db_column='gogek_damsano', blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'gogek'
        
class Jikwon(models.Model):
    jikwon_no = models.IntegerField(primary_key=True)
    jikwon_name = models.CharField(max_length=10)
    buser_num = models.CharField(max_length=20)
    jikwon_jik = models.CharField(max_length=10, blank=True, null=True)
    jikwon_pay = models.IntegerField(blank=True, null=True)
    jikwon_ibsail = models.DateField(blank=True, null=True)
    jikwon_gen = models.CharField(max_length=4, blank=True, null=True)
    jikwon_rating = models.CharField(max_length=3, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'jikwon'
        
class Buser(models.Model):
    buser_no = models.IntegerField(primary_key=True)
    buser_name = models.CharField(max_length=10)
    buser_loc = models.CharField(max_length=10, blank=True, null=True)
    buser_tel = models.CharField(max_length=15, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'buser'

cmd에서 명령어 입력 후, 파일을 만들어 이미 있는 table을 불러온다. 그리고 그것을 models.py에 붙여놓기 한다.

 

 

views.py

from django.shortcuts import render
from myapp.models import Gogek, Jikwon, Buser
import datetime

# Create your views here.

def main(request):
    return render(request, "main.html")

def show(request):
    name = request.POST.get('name')
    tel = request.POST.get('tel')
    
    godata = Gogek.objects.select_related('gogek_damsano').get(gogek_name=name, gogek_tel=tel)
    joindata = godata.gogek_damsano
    budata = Buser.objects.get(buser_no=joindata.buser_num)
    
    # 여러 결과가 나올 것을 대비해서 filter로 찾아서 list로 반환하여 result.html 페이지에서 for문으로 테이블 출력 할 수 있는게 종결세팅

    # 근무 년수 구하기 예
    workdays = datetime.date.today() - joindata.jikwon_ibsail
    workyears = workdays.days // 365
    
    return render(request, "show.html", {'jd':joindata, 'bd':budata, 'workyears':workyears})

show.html 페이지에서 입력한 정보를 가져와야함으로 name과 , tel이라는 변수명에 그것을 담는다.

그리고 그것을 테이블을 호출하면서 join을 실시한다.

부서번호가 buser와 jikwon에도 있기 때문에 그것도 서로 join한다.

각각의 변수명에 담고 그것을 dict 타입으로 페이지로 return 시킨다.

 

 

main.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
window.onload=function(){
       document.querySelector("#btnResult").onclick=chkFunc;
    }
    function chkFunc(){
       if(frm.name.value === ""){
          alert('작성자를 입력하세요');
          frm.name.focus();
          return; 
       }else if(frm.tel.value === ""){
           alert('전화번호를 입력하세요');
           frm.tel.focus();
           return; 
       }
    frm.submit();
    }
</script>
</head>
<body>
<form action="/show" name="frm" method="post"> {% csrf_token %}
<h2>고객 정보 입력</h2>
고객명 : <input type="text" name="name"/>
고객전화 : <input type="text" name="tel"/>
<input type="button" value="확인" id="btnResult">
</form>
</body>
</html>

고객명과 고객전화를 show.html로 post 방식으로 가지고 간다.

post 방식인 경우에는 뒤에 {% csrf_token %}를 잊으면 안 된다.

 

 

show.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>담당직원</h3>
<table style="width:50%" border=1>
<tr>
<td rowspan="2" style="width:30%;">
{% if jd.jikwon_gen == "남"  %}
<img style="width:100%;" src="/static/images/man.png">
{% else %}
<img style="width:100%;" src="/static/images/woman.png">
{% endif %}
</td>

<td>직원명:</td><td>{{jd.jikwon_name}}</td><td>직급:</td><td>{{jd.jikwon_jik}}</td></tr>
<tr><td>부서명:</td><td>{{bd.buser_name}}</td><td>부서전화:</td><td>{{bd.buser_tel}}</td></tr>
<tr><td colspan="2">근무년수:</td><td>{{workyears}}년</td><td>평점:</td>
{% if jd.jikwon_rating == "a" %}
<td>최우수</td>
{% elif jd.jikwon_rating == "b" %}
<td>우수</td>
{% else %}
<td>일반</td>
{% endif %}
</tr>
</table>
</body>
</html>

main.html에서 가져온 정보를 views.py의 show()함수에서 받아서 정보를 정리한다음 변수명에 담아 넘겼으므로 그 변수명을 사용하여 테이블의 정보를 호출할 수 있다.