Django Reference
Django 웹 프레임워크 레퍼런스
Django Reference 소개
Django Reference는 Django 웹 프레임워크의 핵심 구성 요소를 빠르게 찾아볼 수 있는 검색 가능한 치트 시트입니다. 모델(ORM 필드 타입, ForeignKey, ManyToManyField, filter/get/create 등 QuerySet 메서드, 복잡한 조건을 위한 Q 객체), 뷰(HttpResponse, render, redirect, ListView 같은 클래스 기반 뷰, @login_required 데코레이터), 템플릿(변수 출력, 태그, {% for %} 반복, {% extends %}/{% block %} 상속, 내장 필터)의 여섯 가지 핵심 영역을 다룹니다. 각 항목은 구문 이름, 간결한 설명, 실제로 실행 가능한 파이썬 예제 코드를 함께 제공합니다.
이 레퍼런스의 주요 사용자는 백엔드 개발자, 풀스택 엔지니어, Django 부트캠프 수강생입니다. 코드 리뷰 중 objects.filter()와 objects.get()의 정확한 차이를 재확인하거나, 템플릿 상속에서 {% extends %}와 {% block %}이 어떻게 동작하는지 점검할 때 특히 유용합니다. URL 라우팅(path(), include()), 폼 유효성 검사(forms.Form, ModelForm), 인증 헬퍼(authenticate(), UserCreationForm, @permission_required)도 포함되어 있습니다.
항목은 모델, 뷰, 템플릿, URL, 폼, 인증의 여섯 가지 카테고리로 구성되어 있어 필요한 섹션만 빠르게 필터링할 수 있습니다. 모든 처리는 브라우저 내에서 이루어지므로 검색과 카테고리 필터링이 즉각적으로 작동합니다. 한국어와 영어 인터페이스를 모두 지원하며, 다크 모드와 모든 화면 크기에 최적화되어 있습니다.
주요 기능
- ORM 완전 지원: filter(), get(), create(), Q 객체, ForeignKey, ManyToManyField 실제 파이썬 예제 포함
- 뷰 레이어: HttpResponse, render(), redirect(), ListView, @login_required 데코레이터 패턴
- 템플릿 엔진: {{ 변수 }}, {% if %}, {% for %}, {% extends %}/{% block %}, {{ value|필터 }} 구문
- URL 라우팅: path(), include(), reverse(), 이름 있는 URL 패턴 및 int/str 변환기
- 폼: forms.Form 필드 정의, Meta 클래스를 활용한 ModelForm, form.is_valid() 유효성 검사 흐름
- 인증: authenticate(), login(), UserCreationForm, @permission_required 데코레이터
- 모델·뷰·템플릿·URL·폼·인증 6개 카테고리 필터로 원하는 항목 즉시 접근
- 브라우저 내 즉각적인 검색 — 서버 요청 없이 구문명과 설명을 동시에 검색
자주 묻는 질문
objects.filter()와 objects.get()의 차이는 무엇인가요?
objects.filter()는 0개 이상의 객체를 포함하는 QuerySet을 반환하며 체이닝이 가능합니다. objects.get()은 정확히 하나의 객체를 반환하며, 결과가 없으면 DoesNotExist, 둘 이상이면 MultipleObjectsReturned 예외를 발생시킵니다. 기본 키처럼 고유한 결과가 보장될 때는 get()을, 조건부 쿼리에는 filter()를 사용하세요.
클래스 기반 뷰(CBV)는 언제 함수 기반 뷰(FBV)보다 유리한가요?
ListView, DetailView 같은 CBV는 페이지네이션, pk 기반 객체 조회, 폼 처리 등 Django의 제네릭 기능이 필요할 때 유리합니다. 제네릭 패턴에 맞지 않는 커스텀 로직에는 FBV가 더 단순하고 직관적입니다. 두 방식은 같은 프로젝트에서 함께 사용할 수 있습니다.
{% extends %}와 {% block %}으로 템플릿 상속은 어떻게 동작하나요?
자식 템플릿은 {% extends "base.html" %}로 부모 레이아웃을 상속받습니다. 그런 다음 {% block content %}...{% endblock %}으로 이름 지정된 블록을 재정의합니다. 자식이 재정의하지 않은 블록은 부모의 기본 내용이 렌더링됩니다. 이를 통해 헤더, 푸터, 내비게이션을 모든 페이지에서 중복 작성하지 않아도 됩니다.
Q 객체는 언제 사용하나요?
Q 객체는 일반 키워드 인수로 표현할 수 없는 복잡한 쿼리 조건을 |(OR)와 &(AND) 연산자로 조합할 때 사용합니다. 예를 들어 Post.objects.filter(Q(title__contains="django") | Q(title__contains="python"))은 두 단어 중 하나를 포함하는 게시물을 반환합니다.
forms.Form과 ModelForm의 차이는 무엇인가요?
forms.Form은 모든 필드를 직접 정의하고 저장 로직도 직접 작성해야 합니다. ModelForm은 Meta.model에 지정한 모델 클래스로부터 필드를 자동 생성하며, save() 메서드가 해당 데이터베이스 행을 자동으로 생성하거나 업데이트합니다. 폼이 모델과 직접 대응되면 ModelForm을, 여러 모델이 관련되거나 커스텀 폼에는 Form을 사용하세요.
@login_required와 @permission_required의 차이는 무엇인가요?
@login_required는 비로그인 사용자를 로그인 페이지로 리다이렉트합니다. @permission_required는 인증된 사용자가 특정 권한 문자열(예: "blog.add_post")을 보유하고 있는지 추가로 확인하여, 없으면 PermissionDenied를 발생시키거나 리다이렉트합니다. 로그인 여부를 넘어 역할 기반 접근 제어가 필요할 때 @permission_required를 사용하세요.
reverse()는 어떻게 동작하나요?
reverse('url-name', kwargs={'pk': 1})은 런타임에 이름 지정된 URL 패턴의 경로 문자열을 생성합니다. 경로를 하드코딩하지 않아도 되며 urls.py 변경 시 자동으로 반영됩니다. 템플릿의 {% url 'url-name' pk=1 %} 태그와 동일한 동작을 Python 코드에서 수행합니다.
이 레퍼런스를 오프라인에서도 사용할 수 있나요?
네. 페이지가 한 번 로드되면 모든 레퍼런스 데이터가 브라우저에 저장됩니다. 일반적인 사용 중에는 네트워크 요청이 발생하지 않으므로 인터넷 연결 없이도 검색과 필터 기능을 사용할 수 있습니다.