Django 1.11 릴리스와 주요 변경 사항

Django 1.11 릴리스와 주요 변경 사항

사진 출처: Pinkie Pie by Daniel Chang

Django 1.11이 드디어 출시되었습니다. 1.x에서는 마지막 버전인데요. 이 글에서는 Django 1.11에 추가된 기능과 바뀐점을 간략하게 알아보려 합니다. Django 공식 릴리스 노트를 참고하였습니다. 주의! 릴리스 노트를 모두 번역하지는 않았습니다.

하위 버전들의 보안 업데이트도 함께 올라왔습니다. 1.10.7, 1.9.13, 1.8.18


2017-05-11 수정 내역

shlee322 님의 제보로 include 태그와 관련된 내용을 수정하였습니다.


파이썬 호환성

Django 1.11은 파이썬 2.7, 3.4, 3.5, 3.6에서 작동합니다. 3.6을 지원하는 첫 Django 버전입니다. 각 버전별 마지막 릴리스를 사용하기를 추천합니다.

Django 1.11.x는 파이썬 2를 지원하는 마지막 버전입니다. 다음 번 메이저 릴리스인 Django 2.0부터는 파이썬 3.5 이상만 지원할 예정입니다.

새 기능

Index 클래스

Meta 클래스indexes 항목에서 인덱스할 필드를 지정할 수 있고, 이를 위한 Index 클래스도 추가되었습니다.

템플릿 기반의 폼 위젯 렌더링

폼 렌더링 API가 추가되었고, 이를 활용하여 특정 폼 위젯을 커스터마이징할 수 있습니다.

하위 쿼리 표현식

쿼리 결과를 다른 쿼리에서 참조할 수 있는 Subquery 표현식과 쿼리 결과가 존재할 때만 실행할 수 있는 Exists 표현식이 추가되었습니다.

자잘하게 추가된 기능

# 월 단위
2017-02-28 20:11:24.021458+09:00 => 2017-01-01 00:00:00.000000+09:00

# 일 단위
2017-02-28 20:11:24.021458+09:00 => 2017-02-01 00:00:00.000000+09:00

# 시 단위
2017-02-28 20:11:24.021458+09:00 => 2017-02-28 00:00:00.000000+09:00

바뀐 점

collectstatic 실행시 파일 간 순환 참조가 존재하면 오류 발생

해시 값이 붙은 정적 파일 저장소를 사용하고 있을 때,
a.css에서 b.css를 참조하고 b.css에서도 a.css를 참조한다면 collectstatic 명령이 실패합니다.

DateTimeField에 대해 상세 룩업 지원

  • DateField에 대해 week 룩업을 지원합니다.
  • DateTimeField에 대해 time 룩업을 지원합니다.
  • USE_TZ 옵션이 True라면 필드의 값이 현지 시각으로 바뀌어 리턴됩니다.

PostgreSQL 9.2와 PostGIS 2.0 지원 중단

PostgreSQL 9.2의 지원이 2017년 9월에 끝남에 따라, Django 1.11에서는 PostgreSQL 9.3을 최소 지원 버전으로 지정하였습니다.

LiveServerTestCase가 포트 0에 바인드

아울러 DJANGO_LIVE_TEST_SERVER_ADDRESS 옵션이 사라지고, manage.py test 명령에 --liveserver 옵션도 삭제되었습니다.

get_or_create()update_or_create()에서 변수명 검사

모델에 없는 필드를 지정할 경우 오류가 발생합니다. (이전에는 그냥 무시했기 때문에, 타이핑 실수를 찾기가 어려웠죠.)

pytz 패키지 의존성이 추가되었고, TIME_ZONE = None 옵션이 사라집니다.

자동으로 타임존을 설정할 때는 settings 파일에 TIME_ZONE = None 대신 다음처럼 하세요.

from tzlocal import get_localzone

TIME_ZONE = get_localzone().zone

사소한 변경

  • 테스트를 실행할 때도 ALLOWED_HOSTS를 검사합니다. 테스트용 호스트 이름을 사용하고 있다면 이 이름을 ALLOWED_HOSTS에도 넣어야 합니다.
  • 모델 폼에서 CharField가 null=True인 경우, 빈 문자열 대신 NULL을 저장합니다.
  • 체크박스와 셀렉트박스 폼을 렌더링할 때 checked='checked', selected='selected' 대신 checked, selected만 넣습니다.

삭제된 기능

대신 django.urls.reverse()를 사용해야 합니다.

contrib.auth의 각종 함수 기반 뷰

인증과 관련된 함수 기반 뷰들이 클래스 기반 뷰로 바뀌었습니다.

{% include %} 탬플릿 태그 렌더링시 예외를 발생시키지 않았던 부분

include 태그를 렌더링하는 동안 예외가 발생하면 조용히 넘어갔는데, 이것이 꽤나 혼란을 주었나 봅니다. Django 2.1부터는 include 태그를 사용했을 때 예외가 발생합니다.

COMMENTS

}