Django 5 버전 변경사항
django 5.0 의 주요 변경점은 무엇일까요?
Django 5.0 버전이 2023년 12월에 출시 하였습니다.
릴리즈 노트를 참고하여 주요 변경 부분에 대하여 정리해보고자 합니다.
Python 호환성
Django 5.0은 Python 3.10, 3.11 및 3.12를 지원합니다. 각 시리즈의 최신 릴리스만 공식적으로 지원할 것을 적극 권장합니다.
Django 4.2.x 시리즈는 Python 3.8 및 3.9를 지원하는 마지막 버전입니다.
Django 5.0의 새로운 기능
어드민의 패싯(Facet) 필터
UI를 토글하면 이제 관리자 변경 목록에 적용된 필터에 대한 패싯 수가 표시됩니다. 이 동작은 새로운 ModelAdmin.show_facets 속성을 통해 변경할 수 있습니다. 자세한 내용은 패싯을 참조하세요.
Form field렌더링을 위한 심플한 템플릿
Django 5.0에는 필드 그룹과 필드 그룹 템플릿이라는 개념이 도입되었습니다. 이를 통해 Label, Widget, 도움말 텍스트 및 Error와 같은 django form field 의 관련 요소의 렌더링이 간소화됩니다.
아래 템플릿을 예로 들어보겠습니다:
<form>
...
<div>
{{ form.name.label_tag }}
{% if form.name.help_text %}
<div class="helptext" id="{{ form.name.auto_id }}_helptext">
{{ form.name.help_text|safe }}
</div>
{% endif %}
{{ form.name.errors }}
{{ form.name }}
<div class="row">
<div class="col">
{{ form.email.label_tag }}
{% if form.email.help_text %}
<div class="helptext" id="{{ form.email.auto_id }}_helptext">
{{ form.email.help_text|safe }}
</div>
{% endif %}
{{ form.email.errors }}
{{ form.email }}
</div>
<div class="col">
{{ form.password.label_tag }}
{% if form.password.help_text %}
<div class="helptext" id="{{ form.password.auto_id }}_helptext">
{{ form.password.help_text|safe }}
</div>
{% endif %}
{{ form.password.errors }}
{{ form.password }}
</div>
</div>
</div>
...
</form>
다음으로 단순화할 수 있습니다:
<form>
...
<div>
{{ form.name.as_field_group }}
<div class="row">
<div class="col">{{ form.email.as_field_group }}</div>
<div class="col">{{ form.password.as_field_group }}</div>
</div>
</div>
...
</form>
as_field_group()은 기본적으로 “django/forms/field.html” 템플릿을 사용하여 필드를 렌더링하며 프로젝트별, 필드별 또는 요청별로 사용자 정의할 수 있습니다. 재사용 가능한 필드 그룹 템플릿을 참조하세요.
기본값을 데이터베이스에서 연산
새로운 Field.db_default 매개변수를 사용하면 데이터베이스에서 연산된 기본값을 설정할 수 있습니다.
예시입니다:
from django.db import models
from django.db.models.functions import Now, Pi
class MyModel(models.Model):
age = models.IntegerField(db_default=18)
created = models.DateTimeField(db_default=Now())
circumference = models.FloatField(db_default=2 * Pi())
데이터베이스 Generated model field
새로운 GeneratedField를 사용하면 데이터베이스에서 Generated column을 만들 수 있습니다. 이 필드는 지원되는 모든 데이터베이스 백엔드에서 다른 필드에서 항상 계산되는 필드를 만드는 데 사용됩니다.
예시입니다:
from django.db import models
from django.db.models import F
class Square(models.Model):
side = models.IntegerField()
area = models.GeneratedField(
expression=F("side") * F("side"),
output_field=models.BigIntegerField(),
db_persist=True,
)
선언 필드 선택를 위한 추가 옵션
Field.choices(모델 필드용)와 ChoiceField.choices( form 필드용)를 사용하면 값을 선언할 때 더 유연하게 사용할 수 있습니다. 이전 버전의 장고에서 선택 항목은 2-tuple의 목록이거나 열거 형 유형의 서브클래스여야 했지만, 후자의 경우 예상되는 형식으로 값을 제공하기 위해 .choices 속성에 액세스해야 했습니다.
from django.db import models
Medal = models.TextChoices("Medal", "GOLD SILVER BRONZE")
SPORT_CHOICES = [
("Martial Arts", [("judo", "Judo"), ("karate", "Karate")]),
("Racket", [("badminton", "Badminton"), ("tennis", "Tennis")]),
("unknown", "Unknown"),
]
class Winner(models.Model):
name = models.CharField(...)
medal = models.CharField(..., choices=Medal.choices)
sport = models.CharField(..., choices=SPORT_CHOICES)
Django 5.0에서는 iterable 대신 mapping 또는 callable을 허용하는 기능이 추가되었으며, 열거 형을 확장하기 위해 더 이상 .choices를 직접 사용할 필요가 없습니다
from django.db import models
Medal = models.TextChoices("Medal", "GOLD SILVER BRONZE")
SPORT_CHOICES = { # Using a mapping instead of a list of 2-tuples.
"Martial Arts": {"judo": "Judo", "karate": "Karate"},
"Racket": {"badminton": "Badminton", "tennis": "Tennis"},
"unknown": "Unknown",
}
def get_scores():
return [(i, str(i)) for i in range(10)]
class Winner(models.Model):
name = models.CharField(...)
medal = models.CharField(..., choices=Medal) # `.choices` 사용이 필요하지 않습니다
sport = models.CharField(..., choices=SPORT_CHOICES)
score = models.IntegerField(choices=get_scores) # callable 허용
내부적으로 제공된 choices은 choices 값이 업데이트될 때마다 정규 형 2-튜플 목록으로 정규화됩니다. 자세한 내용은 choices에 대한 모델 필드 레퍼런스를 참조하세요.