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()함수에서 받아서 정보를 정리한다음 변수명에 담아 넘겼으므로 그 변수명을 사용하여 테이블의 정보를 호출할 수 있다.