목록개발/django (14)
파파비의 블로그
1) Book -> Author로 query하기 Book.objects.filter(author__fieldname = "data") >> 필터에 먼저 book에서의 원하는 필드 이름을 적고, 그 필드가 만약 또 다른 relation하고 연결되어 있다면 __를 적으면 해당 relation의 필드로 접근이 가능하다. >> Book.objects.filter(author__last_name = "Rowling") : author 필드는 author class의 객체가 들어가므로 __를 통해 author class의 last_name 속성에 접근하였다. >> Book.objects.filter(author__last_name__contains = "wling") : 최종 필드에 도착한 이후에는 __를 적고 위..
Database system에 여러번 호출하는 것은 당연히 퍼포먼스상으로 좋지 않다. Django는 그런 것에 대한 나름대로의 퍼포먼스를 위한 최적화가 되어있다. 장고는 DB에 대한 query에 대해, 해당 output을 활용하기 전까지는 변수에 명령어 형태로 저장한다. 그리고 최종적으로 data가 활용되는 시점에서 각 명령어들을 실행하여 최적의 퍼포먼스로 행하게 된다. 예를 들어, 아래와 같은 코드는 db와 몇번 contact 했을까? best_sellers = Books.objects.filter(is_bestseller="True") amazing_best_sellers = best_sellers.filter(rating__gt=4) print(amazing_best_sellers) 1번이다. 먼저..
Static file? > 내용이 dynamic하게 변하지 않는 부분 > css파일, image file 등을 의미 > view, html 등은 dynamic한 요소들이 있어 static이 아님 이런 파일들을 사용하기 위한 방법은 1) 일단 어디에 저장해두어야할까? > app 수준이라면, app 폴더 내 static > app 이름 폴더 안에 파일 저장 > template 저장 처럼, 폴더 안에 앱이름 폴더를 또 만드는 관례를 따른다. static이라는 폴더로 명명해야한다. 2) Setting를 확인한다. > INSTALLED_APPS 안에 'django.contrib.staticfiles' 이 포함되어 있어야 한다. 디폴트로 되어 있다. (따로할건 없다) 3) 코드로 사용한다. 1. app 수준의 cs..
404 에러를 내는 방법은 크게 2가지가 있다. 1) render_to_string > HttpResponseNotFound() 사용하기 - 좀 돌아가는 방법이다. - render의 과정을 거쳐야하고, render() 함수를 사용할 수는 없다. render는 404 에러를 브라우저에 나타내지 않기 때문이다. 2) shortcut인 HTTP404 - rasie HTTP404() 를 실행하면, - template 안에 404.html 파일을 찾아나서고 해당 파일을 보여준다. - 파일이름을 404.html로 잘 설정해두는 것이 중요하다
템플릿 전체가 아니라, 일부만을 사용하고 싶을 때가 있을 것이다. HTML의 일부 덩어리들 말이다. 그런 부분들은 include라는 tag를 활용한다. 먼저 따로 snippet으로 활용될 html을 다른 폴더에 만들어둔다. 폴더 및 파일의 이름은 자유롭게 해도 된다. includes 라는 폴더에 header 라는 html 파일을 만들어 두었다. header.html은 아주 간단하게 header에 nav 기능이 달린 것을 넣어두었고 변수도 하나 넣어두었다. 해당 html을 활용하기 위해선 include 태그를 이용해서 html 파일을 특정해준다. include 시 특이한 점은, 만약 저 해당 block에 var에 대한 값이 존재한다면 var에 자동으로 값이 부여된다는 점이다. var 변수가 특정되지 않을 ..
Django 를 활용하여 HTML 파일들을 사용하다보면, 중복되는 코드들이 많이 생길 때가 많다. HTML의 기본적인 뼈대 부분은 사실상 거의 중복이 많이된다. 그래서 내용이 바뀌는 부분만 HTML에 표시하고, 나머지 부분은 그대로 활용하는 것이 가능하다. 그것이 상속의 개념과 비슷해서 Inheritance라고 부르나보다 방식은 Block Tag를 사용하는 것이다. 1) base html 준비하기 여러번 활용될 base html 파일안에, dynamic하게 활용될 부분에 block tag를 심어둔다. 여기에는 2개의 block tag가 존재한다. title 쪽과 body 쪽이다. 이제 우리는 이 틀을 활용하면 각 block에 들어갈 내용들만 넣은 html을 활용할 수 있다. 2) 활용하기 1. exten..
Tag는 filter랑 다른 또 다른 Django Tamplates Language 중 하나이다. Tag를 통해 다양한 기능들을 할 수 있는데, 가령 for 문을 돌리는 것이다. list를 주면, 그 리스트의 개수만큼 돌리는 작업을 해야할 때, 우리는 for을 tag를 사용하여 template을 만들 수 있다. Tag는 {{ }} 이 아닌, {% %} 로 구성된다 만약 for문이라면, list item을 생성한다고 예를 들어보면 {% for a in b %} {{ a }} {% endfor %} 이렇게 구성을 할 수 있다. 참고로 for 의 a는 block안에서 얼마든지 접근 가능하다. 아래 링크를 참고하면 다양한 tags / fliters 에 대한 것들을 확인할 수 있다. https://docs.dja..
template에 dynamic하게 내용을 입력할 때, 우리는 .capitalize() 라던가 등의 formatting 작업을 하기도 한다. 그런데 이런 로직들을 view에서 하는 것보다는, view에서는 비즈니스 로직에 집중하고, 형식과 같은 formatting은 템플릿 자체 내에서하는 것이 깔끔하고 좋다. 그렇게 하기 위한 기능으로 filter 라는 것들이 있다. filter란, template 안에 {{ }} 부분에 | 를 통해 특정 기능을 추가하는 것을 말한다. {{ key | title }} 이렇게 하게 되면 title이라는 필터가 생겨 key의 값이 어떤 것이든 첫글자가 대문자가 된다. 참고) 대표적인 filter 들을 확인할 수 있음 https://www.geeksforgeeks.org/dj..