CharField는 Django 모델에서 가장 자주 쓰는 필드 중 하나로, 짧은 텍스트를 저장하는 칸입니다. 이름, 제목, 주소처럼 한 줄짜리 글자를 담을 때 씁니다.
아래 흐름도로 전체 개념을 한눈에 확인해 보세요.---

엑셀의 셀 하나라고 생각하면 쉬워요. 이름, 제목, 브랜드명처럼 한 줄짜리 텍스트를 담는 용도입니다.
name = models.CharField(max_length=100)
이 한 줄이 DB에 VARCHAR(100) 컬럼 하나를 만들어 줍니다.
| 옵션 | 역할 | 예시 |
|---|---|---|
max_length | 최대 글자 수 (필수!) | max_length=100 |
blank=True | 폼에서 비워도 됨 | 선택 입력 항목에 사용 |
null=True | DB에 NULL 저장 허용 | blank와 함께 쓸 때가 많음 |
default='' | 기본값 설정 | 아무것도 안 입력하면 이 값 |
blank와null의 차이가 헷갈릴 수 있는데,blank는 "폼 입력 검증",null은 "DB 저장" 의 문제입니다.
TextField 써야 할 때: 게시글 본문, 리뷰 내용처럼 길고 제한 없는 텍스트IntegerField 써야 할 때: 나이, 가격처럼 숫자궁금한 옵션이 있으면 다이어그램의 각 박스를 클릭해 더 물어볼 수 있어요! 😊
CharField blank 옵션이 뭔가요?
blank=True 옵션이란?blank는 폼(Form) 입력 시 이 칸을 비워도 되는지 를 결정하는 옵션입니다.
회원가입 페이지를 떠올려보세요.
- 이름 입력칸 → 필수 (비우면 "이름을 입력해주세요" 오류)
- 닉네임 입력칸 → 선택 (비워도 통과)
이 "선택 칸"을 만들 때
blank=True를 씁니다.
class User(models.Model):
username = models.CharField(max_length=50)
# blank 없음 = 기본값이 blank=False
# → 폼에서 반드시 입력해야 함
nickname = models.CharField(max_length=50, blank=True)
# → 폼에서 비워도 통과됨
blank vs null 차이 (자주 헷갈리는 부분!)| 옵션 | 언제 작동하나? | 역할 |
|---|---|---|
blank=True | 폼 입력할 때 | "이 칸 안 채워도 됩니다" |
null=True | DB에 저장할 때 | "DB에 NULL 값 저장 허용" |
CharField는 보통 null=True 없이 blank=True만 써도 충분합니다. 비어있을 때 DB에 NULL 대신 빈 문자열 ''을 저장하기 때문입니다.
# CharField 권장 패턴
nickname = models.CharField(max_length=50, blank=True, default='')
# ↑ 폼 비워도 됨 ↑ 빈 문자열로 저장
blank=True= "이 항목은 선택 입력입니다" 라고 Django에게 알려주는 것
추가로 궁금한 옵션 있으면 알려주세요! 😊
CharField null 옵션이 뭔가요?
null=True 옵션이란?null은 DB(데이터베이스)에 저장할 때 "값 없음"을 NULL로 저장할지 를 결정하는 옵션입니다.
엑셀 셀을 떠올려보세요.
- 셀에 빈 문자열
''저장 → 셀이 존재하는데 내용이 없는 것- 셀에 NULL 저장 → 셀 자체에 "아무 값도 없음" 표시
이 두 가지는 DB 입장에서 다른 값입니다.
class User(models.Model):
nickname = models.CharField(max_length=50, blank=True)
# null=True 없음 → 비어있으면 DB에 '' (빈 문자열) 저장
bio = models.CharField(max_length=200, blank=True, null=True)
# null=True 있음 → 비어있으면 DB에 NULL 저장
| 상황 | null=True 없을 때 | null=True 있을 때 |
|---|---|---|
| 닉네임 입력 안 함 | '' (빈 문자열) | NULL |
| 닉네임 입력함 | 'heeyoung' | 'heeyoung' |
blank vs null 한눈에 비교blank=True → 폼(화면) 단계에서 작동 → "입력 안 해도 됨"
null=True → DB 저장 단계에서 작동 → "NULL로 저장 허용"
사용자가 폼에 아무것도 안 입력
↓
blank=True? ─── No ──→ "필수 항목입니다" 오류 발생
│
Yes
↓
DB에 저장할 때
null=True? ─── No ──→ '' (빈 문자열) 로 저장
│
Yes
↓
NULL 로 저장
CharField는 null=True를 되도록 쓰지 않는 것이 Django 권장 방식입니다. "값 없음"을 표현하는 방법이 NULL과 '' 두 가지가 생겨서 나중에 조회할 때 혼란스럽기 때문입니다.
# 권장
nickname = models.CharField(max_length=50, blank=True, default='')
# 비권장 (CharField에서)
nickname = models.CharField(max_length=50, blank=True, null=True)
null=True는CharField보다IntegerField,DateField같은 숫자/날짜 필드에서 더 자연스럽게 씁니다. 숫자 필드는 "값 없음"을0으로 표현하면 의미가 달라지기 때문입니다.
null=True= "이 칸이 비어있을 때 DB에 NULL로 저장해도 됩니다" 라고 Django에게 알려주는 것
궁금한 게 있으면 더 물어보세요! 😊
CharField max_length 옵션이 뭔가요?
max_length 옵션이란?max_length는 이 칸에 입력할 수 있는 최대 글자 수를 정하는 옵션입니다. CharField에서 반드시 써야 하는 필수 옵션입니다.
종이 서류의 입력칸을 떠올려보세요.
- 이름 칸 →
[ _ _ _ _ _ _ _ _ _ _ ](10칸)- 주소 칸 →
[ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ](20칸)
max_length는 이 칸의 크기를 정하는 것입니다.
class User(models.Model):
username = models.CharField(max_length=50)
# 최대 50글자까지만 저장 가능
email = models.CharField(max_length=200)
# 최대 200글자까지 저장 가능
max_length=50 설정 시
① DB 테이블 생성할 때
→ VARCHAR(50) 컬럼으로 만들어짐
→ DB 자체에서 50자 초과 저장 차단
② 폼(화면) 입력할 때
→ 51자 이상 입력하면 "이 필드의 최대 길이는 50입니다" 오류 발생
→ Django가 자동으로 검증해줌
| 저장할 내용 | 권장 값 | 이유 |
|---|---|---|
| 이름, 닉네임 | 50 | 대부분 50자 이내 |
| 이메일 주소 | 200 | 이메일 최대 길이 규격 |
| 제목, 상품명 | 100~200 | 여유 있게 설정 |
| 주소 | 255 | 긴 주소 대비 |
| 비밀번호(해시) | 128 | 암호화된 문자열 길이 |
긴 글(게시글 본문, 리뷰 내용 등)은
max_length가 없는TextField를 쓰는 게 맞습니다.
# 이렇게 쓰면 오류 발생!
name = models.CharField()
# Django가 이렇게 알려줌:
# TypeError: CharField requires a max_length attribute.
CharField는 max_length 없이는 아예 실행이 안 됩니다.
max_length= "이 칸에는 최대 몇 글자까지 쓸 수 있나요?" 를 Django와 DB에게 알려주는 필수 설정
궁금한 게 있으면 더 물어보세요! 😊
CharField default 옵션이 뭔가요?
default 옵션이란?default는 아무것도 입력하지 않았을 때 자동으로 채워지는 기본값을 설정하는 옵션입니다.
회원가입 폼을 떠올려보세요.
- 국가 선택칸 → 아무것도 안 고르면 자동으로 "대한민국" 이 선택됨
- 등급 칸 → 처음 가입하면 자동으로 "일반회원" 으로 설정됨
이 "자동으로 채워지는 값"이 바로
default입니다.
class User(models.Model):
username = models.CharField(max_length=50)
# default 없음 → 반드시 값을 넣어야 함
country = models.CharField(max_length=50, default='대한민국')
# 아무것도 안 입력하면 자동으로 '대한민국' 저장
grade = models.CharField(max_length=20, default='일반회원')
# 아무것도 안 입력하면 자동으로 '일반회원' 저장
| 상황 | default 없을 때 | default='일반회원' 있을 때 |
|---|---|---|
| 값을 입력함 | '관리자' 저장 | '관리자' 저장 |
| 값을 안 입력함 | 오류 발생 | '일반회원' 자동 저장 |
# 1. 빈 문자열 (가장 많이 씀)
nickname = models.CharField(max_length=50, blank=True, default='')
# 2. 특정 문자열
grade = models.CharField(max_length=20, default='일반회원')
# 3. 함수로 동적 생성 (호출 가능한 객체)
import uuid
code = models.CharField(max_length=36, default=uuid.uuid4)
# → 저장할 때마다 자동으로 고유한 코드 생성
blank=True와 함께 쓰는 이유blank=True → 폼에서 비워도 됨
default='' → 비웠을 때 DB에 '' 로 저장
이 두 개를 함께 써야 완전한 "선택 입력 칸"이 완성됨
# CharField 선택 입력 칸의 권장 패턴
nickname = models.CharField(max_length=50, blank=True, default='')
# ↑ 폼에서 비워도 됨
# ↑ 비면 '' 로 저장
default= "아무것도 입력 안 하면 이 값으로 자동 저장해줘" 라고 Django에게 알려주는 것
궁금한 게 있으면 더 물어보세요! 😊