Ajax with Django #4
이미지 썸네일 처리
큰 이미지를 CSS로 이미지 크기만 줄이는 것은 도움이 되지 않습니다.실제 서버에서 다운받을 때부터 적절히 조절하는 것이 좋습니다.
- 이미지 업로드 받을 때 미리 조절해서 한 버전 혹은 여러 버전으로 저장 해두거나
- 이미지를 서빙받을 때 동적으로 조절해서 내려주거나
Image Libraries
- sorl-thumbnail
- easy-thumbnails
1 | pip3 install easy-thumbnails |
사용법은 예시를 통해!
예시
1 | {% load thumbnail %} |
위에 코드를 아래처럼 바꿀수있다
1 | {% load thumbnail %} |
1 | #post_detail.html 에서 |
댓글 레이아웃 개선
bootstrap에서 양식따와서 수정함
왼쪽 사진 오른쪽 댓글로 구성됨.
댓글 페이징처리
blog템플릿에 post_detail에 있던내용중 comment-list를 따로 blog템플릿Comment_list.html 뺌
1 | <div id="'comment-list"> |
따로 만들어줌
댓글 Ajax 새로고침
Comment-id를 추출해서 이 id값이 더 높은 값이 있다면 새로고침을 하는 방식으로 구현
1 | #blog/templates/_comment.html |
1 | # post_detail.html 글쓰기 아래 부분에 추가 |
1 | view.py |
사용자 인증 연동
로그인 로그아웃. next인자를 넣어준다면 그전 url로 자동으로 돌아감
1 | <div id="navbar" class="collapse navbar-collapse"> |
loginview, logoutview에 인자 넘기는 법
1 | urls.py 에서 |
로그인 창 또한 ajax로 처리하는 방법
- modal을 이용해야하는데 이미 앞에서 class=comment-form-btn을 click이벤트가 발생하면 ajax로 처리하는 일반화된 것을 만들어놓음 따라서 로그인 버튼에 class=comment-form-btn이라고 지정만 해주면 처리가 될것이다 (앞에서는 detail안에만 있지만 이것을 일반화시키면 모두 modal로 띄워줄수있다)
1 | comment-form에 관한 모든것을 다 modal-form으로 바꾸고 일반화 |
위에 처럼 바꾸면 로그인을 하는순간 ajax post로 보냈으므로 html로 응답되기를 기대되는데 로그인 성공하면 post_detail로 redirect가 일어나 일어난것에 대해 ajax요청이니까 post에 대한 json응답을 받아버림
- ajax로 처리하는과정
1 | class LoginView(AuthLoginView): |
1 | 프젝/layout.html 내용 추가 |
지금까지 modal 사용, ajax연결 등을 자세히 배웠음
JavaScript Chart 데이터 연동
다양한 JavaScript 차트
- Chart.js #home
- D3.js
- Highcharts.js
- Chartist.js
- Google Chart
- 이 외에도 수많은 라이브러리가 있습니다.
장고와의 연동에서 주안점
- Chart 라이브러리 static 연결
- CDN 버전 연결
- static 직접 호스팅 1
- 데이터 연동 : 데이터가 고정된 차트를 보고 싶지 않습니다.
- Inline JavaScript를 통한 데이터 공급
- Ajax를 통한 데이터 공급
Tip: 참고: [장고 기본편] StaticFiles - CSS/JavaScript 파일을 어떻게 관리해야할까요?
django chart 앱
- django-chartjs: Django Class Based Views to generate Ajax charts js parameters. This is compatible with Chart.js and Highcharts JS libraries.
- django-jchart: This Django app enables you to configure and render Chart.JS charts directly from your Django codebase.
- django-chart-tools: django-chart-tools is a simple app for creating charts in django templates using Google Chart API.
- django-rest-pandas: Serves up Pandas dataframes via the Django REST Framework for use in client-side (i.e. d3.js) visualizations and offline analysis (e.g. Excel)
javascript chart 활용법을 먼저 익히세요.
- django chart 앱을 통해, 장고에서 손쉽게 차트를 사용하실 수는 있습니다.
- 하지만 django chart 앱과 연동된 차트 외에 더 많은 JavaScript 차트가 있습니다.
- 게다가 django chart 앱에서는 본연의 JavaScript의 모든 기능을 활용하 지 못하고 있을 가능성도 있습니다.
- JavaScript 차트를 직접 활용하실 줄 아셔야 합니다.
백엔드 도움없이 프론트엔드 단에서만 차트 그리기
Chart.js 간단 샘플
1 | <!doctype html> |
백엔드에서 데이터 넘겨주기 (1) 템플릿 렌더링 시에 데이터 넘겨주기
유틸리티 코드) 웹툰 평점 크롤링
1 | import requests |
뷰 코드
차트 데이터들을 server side에서 javascript 형식으로 렌더링하기
1 | from django.shortcuts import render |
뷰 render에서 넘겨진 comic 사전 활용 템플릿
1 | {{ comic }} |
위에 호출은 django단에서 처리되고 script태그 안에있는것은 django한테는 그냥 문자열이지
django문법
1 | {% %} |
를 써서 javascript문자열들을 만들어줌
1 | <!doctype html> |
1 | <script> |
백엔드에서 데이터 넘겨주기 (2) Ajax 활용
urls.py
1 | urlpatterns = [ |
뷰 코드
1 | from django.shortcuts import render |
템플릿 코드
1 | {% load static %} |
백엔드에서 데이터 넘겨주기 (3) django-chartjs 활용(추천안함)
django-chartjs 활용 뷰코드
data_json 뷰를 django-chartjs를 통해 만들기
1 | from chartjs.views.lines import BaseLineChartView |
Tip
javascript chart를 장고와 연동하기 전에, html/css/javascript만으로 javascript chart를 우선 익혀보세요.
그래야만 자유자재로 chart를 활용하실 수 있습니다.
그 후에, django chart 앱을 활용하시며, 소스코드도 까보세요.
크롤링 로우 데이터
1 | {'title': '마음의 소리', 'ep_list': [{'title': '1203. 그 동상', 'url': 'https://comic.naver.com/webtoon/detail.nhn?titleId=20853&no=1207&weekday=tue', 'rating': '9.73', 'date': '2019.12.30'}, {'title': '1202. 당숙 어르신', 'url': 'https://comic.naver.com/webtoon/detail.nhn?titleId=20853&no=1206&weekday=tue', 'rating': '9.77', 'date': '2019.12.23'}, {'title': '1201. 겨울 옷차림', 'url': 'https://comic.naver.com/webtoon/detail.nhn?titleId=20853&no=1205&weekday=tue', 'rating': '9.85', 'date': '2019.12.16'}, {'title': '1200. 양심의소리', 'url': 'https://comic.naver.com/webtoon/detail.nhn?titleId=20853&no=1204&weekday=tue', 'rating': '9.95', 'date': '2019.12.09'}, {'title': '1199. 백야', 'url': 'https://comic.naver.com/webtoon/detail.nhn?titleId=20853&no=1203&weekday=tue', 'rating': '9.81', 'date': '2019.12.02'}, {'title': '1198. 성함이…?', 'url': 'https://comic.naver.com/webtoon/detail.nhn?titleId=20853&no=1202&weekday=tue', 'rating': '9.93', 'date': '2019.11.25'}, {'title': '1197. 학예회', 'url': 'https://comic.naver.com/webtoon/detail.nhn?titleId=20853&no=1201&weekday=tue', 'rating': '9.85', 'date': '2019.11.18'}, {'title': '1196. 키아누 X브스', 'url': 'https://comic.naver.com/webtoon/detail.nhn?titleId=20853&no=1200&weekday=tue', 'rating': '9.80', 'date': '2019.11.11'}, {'title': '1195. 상의', 'url': 'https://comic.naver.com/webtoon/detail.nhn?titleId=20853&no=1199&weekday=tue', 'rating': '9.73', 'date': '2019.11.04'}, {'title': '1194. 불법스캔', 'url': 'https://comic.naver.com/webtoon/detail.nhn?titleId=20853&no=1198&weekday=tue', 'rating': '9.54', 'date': '2019.10.28'}] |