Django 5일차 (Datepicker)
오늘은 날짜 별로 db를 정렬하는 방법에 대해 공부해 보기로 했다.
단순히 charfield를 만들어서 구현을 해도 좋지만
보기 좋게 만들기 위해 datepicker을 사용해 보기로했다.
datepicker은 사용하기 굉장히 쉽다.
DatePicker
<link
rel="stylesheet"
href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"
/>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script>
$(function () {
$("#datepicker").datepicker({ dateFormat: "yy-mm-dd" });
});
</script>
해당 html의 헤더란에 위 코드를 집어넣고
body에 아래코드를 집어 넣어 폼을 완성하면 된다.
<form action="./" method="post">
Date: <input autocomplete="off" type="text" id="datepicker" name="formdate" />
{% csrf_token %}
<input type="submit" value="검색" />
</form>
이번에도 마찬가지로 get으로 page를 볼때 post로 날짜를 받아 볼때
처리를 다르게 하는 것을 생각을 하며 코드를 구현했다.
view.py
class daysearch_VIEW(View):
def get(self, request):
board_list = Board2.objects.all().order_by('-hits')
context = {'board_list': board_list, 'check_error': True}
return render(request, 'user/daysearch.html', context)
def post(self, request):
form_date = request.POST['formdate']
try:
date = parse_date(form_date)
board_list = Board2.objects.all().filter(
date__range=[date, date + timedelta(days=1)]).order_by('-hits')
context = {'board_list': board_list, 'check_error': True}
except TypeError:
context = {'check_error': False}
return render(request, 'user/daysearch.html', context)
결과는 위와 같다. get 방식을 사용할때는 딱히 필터링을 하지는 않았다.
대회에서는 아마 오늘 기준으로 구현을 할 듯 하다.
post 방식의 경우에는 버튼을 통해 받아온 날짜, 즉 formdate를 가져오는데
이 때 timedelta 함수를 사용하게 된다. 우선 string 형식으로 data를 받았기 때문에
이를 date 객체로 만들어 주는 함수인 parse_date를 사용한다.
그 후 지정한 하루동안의 data 만을 가져올 예정이기 때문에
filter 내에 date__range를 사용하게 되는데, 첫번째 인자로는 date를 그대로 넣고
두번째 인자로는 timedelta(days=1)을 사용하여 기존의 date에 +1 한 값을 넣는다.
이때 try-catch 문을 쓰는데 만약 들어온 date가 형식에 맞지 않을 경우
date를 parse할 때 TypeError 가 발생하게 된다. 이에 맞춰 check_error라는 변수를 만들어
error 가 있다면 false값을 주어 html에서 올바르지 않은 형식이 들어왔음을 알려준다.
아래는 결과 화면이다.
실제로는 에러 관리를 어떻게 하는지 오늘 다시 한번 생각해 봐야할 것 같다.
TypeError을 이렇게 handling 하는것 보다는 더 좋은 방법이 있지 않을까...
오늘은 대회에서 보안 관련한 사전설명회가 있어서 많은 내용을 학습하지는 못했다.
내일 부터는 오늘 교육 받은 내용에 대해 예를 들어 Django에서는
Prepared statement를 어느 방식으로 사용해야하는지 이런 부분도 생각을 해봐야겠다.