Django 하이라이트: 모델, 관리자 및 관계형 데이터베이스 활용(3부)

게시 됨: 2022-03-10
빠른 요약 ↬ 관리자 패널은 Django 웹 프레임워크가 제공하는 가장 강력하고 유연한 기능 중 하나이며 즉각적인 기성 기능과 무한 사용자 지정 기능을 결합합니다. 라이브러리 인벤토리 시스템을 기반으로 하는 예제 프로젝트를 사용하여 관리자 패널을 사용하여 Django에서 모델을 만들고 관계형 데이터베이스와 상호 작용하는 방법을 배웁니다.

시작하기 전에 Django의 기본 제공 관리 기능은 사용자 지정 후에도 최종 사용자를 위한 것이 아닙니다. 관리자 패널은 소프트웨어를 만들고 유지 관리하기 위한 개발자, 운영자 및 관리자 도구로 존재합니다. 최종 사용자에게 귀하가 개발하는 플랫폼에 대한 조정 기능이나 기타 관리자 기능을 제공하는 데 사용되지 않습니다.

이 기사는 두 부분으로 구성된 가설을 기반으로 합니다.

  1. Django 관리자 패널은 너무 직관적이어서 기본적으로 사용 방법을 이미 알고 있습니다.
  2. Django 관리자 패널은 매우 강력하여 Django 모델을 사용하여 관계형 데이터베이스에서 데이터를 표현하는 방법을 학습하는 도구로 사용할 수 있습니다.

관리자 패널의 더 강력한 기능을 활성화하려면 여전히 일부 구성 코드를 작성해야 하며 Django의 모델 기반 ORM(객체 관계형 매핑)을 사용하여 데이터 표현을 지정해야 한다는 경고와 함께 이러한 아이디어를 제안합니다. 우리 시스템에서.

권장 읽을거리

"Django Highlights"는 Django에서 웹 개발의 중요한 개념을 소개하는 시리즈입니다. 보안 사용자 인증 흐름 제공에 대해 읽고 Django 템플릿을 사용하여 복잡한 페이지를 작성하는 방법에 대한 데모를 따라갈 수 있습니다.

점프 후 더! 아래에서 계속 읽기 ↓

설정

이 기사에서는 샘플 프로젝트로 작업할 것입니다. 이 프로젝트는 도서관이 책과 고객에 대해 저장할 일부 데이터를 모델링합니다. 이 예는 사용자 및/또는 인벤토리를 관리하는 많은 유형의 시스템에 상당히 적용 가능해야 합니다. 다음은 데이터가 어떻게 보이는지 살짝 보여줍니다.

데이터 모델. (큰 미리보기)

로컬 컴퓨터에서 실행되는 예제 코드를 얻으려면 다음 단계를 완료하십시오.

1. 패키지 설치

Python 3.6 이상이 설치된 상태에서 디렉터리와 가상 환경을 만듭니다. 그런 다음 다음 패키지를 설치합니다.

 pip install django django-grappelli

Django는 이 기사에서 우리가 작업하고 있는 웹 프레임워크입니다. ( django-grappelli 는 간단히 다룰 관리자 패널 테마입니다.)

2. 프로젝트 가져오기

이전 패키지가 설치된 상태에서 GitHub에서 예제 코드를 다운로드합니다. 달리다:

 git clone https://github.com/philipkiely/library_records.git cd library_records/library

3. 슈퍼유저 생성

다음 명령을 사용하여 데이터베이스를 설정하고 수퍼유저를 만듭니다. 명령줄 인터페이스는 수퍼유저를 만드는 과정을 안내합니다. 슈퍼유저 계정은 잠시 후 관리자 패널에 액세스하는 방법이므로 설정한 암호를 기억해야 합니다. 사용:

 python manage.py migrate python manage.py createsuperuser

4. 데이터 로드

탐색을 위해 데이터베이스에 로드할 수 있는 고정 장치라는 데이터 세트를 만들었습니다(문서 끝에서 고정 장치를 만드는 방법에 대해 자세히 알아보기). 관리자 패널에서 탐색하기 전에 고정 장치를 사용하여 데이터베이스를 채웁니다. 달리다:

 python manage.py loaddata ../fixture.json

5. 예제 프로젝트 실행

마지막으로 예제 코드를 실행할 준비가 되었습니다. 서버를 실행하려면 다음 명령을 사용하십시오.

 python manage.py runserver

프로젝트를 보려면 브라우저를 https://127.0.0.1:8000으로 엽니다. /admin/ 의 관리자 패널로 자동 리디렉션됩니다. library/urls.py 의 다음 구성으로 이를 수행했습니다.

 from django.contrib import admin from django.urls import path from records import views urlpatterns = [ path('admin/', admin.site.urls), path('', views.index), ]

records/views.py 에서 다음과 같은 간단한 리디렉션과 결합:

 from django.http import HttpResponseRedirect def index(request): return HttpResponseRedirect('/admin/')

관리자 패널 사용

우리가 해냈다! 페이지를 로드하면 다음과 같은 내용이 표시되어야 합니다.

Django 관리자 패널 메인 페이지. (큰 미리보기)

이 보기는 records/admin.py 의 다음 상용구 코드로 수행됩니다.

 from django.contrib import admin from .models import Book, Patron, Copy admin.site.register(Book) admin.site.register(Copy) admin.site.register(Patron)

이 보기는 시스템이 저장하는 데이터에 대한 초기 이해를 제공해야 합니다. 몇 가지 미스터리를 제거하겠습니다. GroupsUsers 는 Django에 의해 정의되고 시스템 계정에 대한 정보와 권한을 저장합니다. 이 시리즈의 이전 기사에서 User 모델에 대해 자세히 읽을 수 있습니다. Books , CopysPatrons 는 마이그레이션을 실행할 때 생성하고 고정 장치를 로드하여 채워진 데이터베이스의 테이블입니다. Django는 철자가 잘못된 "copy"와 같은 경우에도 "s"를 추가하여 모델 이름을 순진하게 복수화합니다.

데이터 모델. (큰 미리보기)

우리 프로젝트에서 Book 은 제목, 저자, 출판 날짜 및 ISBN(International Standard Book Number)이 있는 레코드입니다. 도서관은 각 BookCopy 을 유지하거나 여러 권을 유지합니다. 각 CopyPatron 가 체크아웃하거나 현재 체크인할 수 있습니다. Patron 는 주소와 생년월일을 기록하는 User 의 확장입니다.

생성, 읽기, 업데이트, 파괴

관리자 패널의 표준 기능 중 하나는 각 모델의 인스턴스를 추가하는 것입니다. "도서"를 클릭하여 모델 페이지로 이동하고 오른쪽 상단 모서리에 있는 "도서 추가" 버튼을 클릭합니다. 그렇게 하면 양식이 나타나며 이 양식을 작성하고 저장하여 책을 만들 수 있습니다.

책 만들기(큰 미리보기)

Patron 을 생성하면 관리자의 생성 양식에 내장된 또 다른 기능이 나타납니다. 동일한 양식에서 직접 연결된 모델을 생성할 수 있습니다. 아래 스크린샷은 User 드롭다운 오른쪽에 있는 녹색 더하기 기호에 의해 트리거되는 팝업을 보여줍니다. 따라서 동일한 관리 페이지에서 두 모델을 모두 생성할 수 있습니다.

후원자를 만드십시오. (큰 미리보기)

동일한 메커니즘을 통해 COPY 를 생성할 수 있습니다.

각 레코드에 대해 행을 클릭하여 동일한 양식을 사용하여 편집할 수 있습니다. 관리자 작업을 사용하여 레코드를 삭제할 수도 있습니다.

관리자 작업

관리자 패널의 기본 제공 기능은 매우 유용하지만 관리자 작업을 사용하여 자신만의 도구를 만들 수 있습니다. 우리는 두 가지를 만들 것입니다. 하나는 책의 복사본을 만들기 위한 것이고 다른 하나는 도서관에 반납된 책을 체크인하기 위한 것입니다.

Book Copy 을 만들려면 /admin/records/book/ URL로 이동하고 "작업" 드롭다운 메뉴를 사용하여 "책 사본 추가"를 선택한 다음 왼쪽 열에 있는 확인란을 사용합니다. 목록에 복사본을 추가할 책을 선택하려면 테이블의

복사 작업을 만듭니다. (큰 미리보기)

이것을 만드는 것은 우리가 나중에 다룰 모델 방법에 의존합니다. 다음과 같이 Profile 모델에 대한 ModelAdmin 클래스를 만들어 관리자 작업으로 호출할 수 있습니다 .

 from django.contrib import admin from .models import Book, Patron, Copy class BookAdmin(admin.ModelAdmin): list_display = ("title", "author", "published") actions = ["make_copys"] def make_copys(self, request, queryset): for q in queryset: q.make_copy() self.message_user(request, "copy(s) created") make_copys.short_description = "Add a copy of book(s)" admin.site.register(Book, BookAdmin)

list_display 속성은 모델의 개요 페이지에서 모델을 나타내는 데 사용되는 필드를 나타냅니다. actions 속성은 관리자 작업을 나열합니다. 우리의 관리 작업은 BookAdmin 내에서 함수로 정의되며 관리 개체 자체, 요청(클라이언트가 보낸 실제 HTTP 요청) 및 쿼리 집합(상자가 선택된 개체 목록)의 세 가지 인수를 취합니다. 쿼리 세트의 각 항목에 대해 동일한 작업을 수행한 다음 사용자에게 작업이 완료되었음을 알립니다. 모든 관리 작업에는 드롭다운 메뉴에서 적절하게 식별할 수 있도록 간단한 설명이 필요합니다. 마지막으로 모델 등록 시 BookAdmin 을 추가합니다.

속성을 일괄적으로 설정하기 위한 관리자 작업을 작성하는 것은 꽤 반복적입니다. 다음은 Copy 체크인을 위한 코드입니다. 이전 작업과 거의 동일합니다.

 from django.contrib import admin from .models import Book, Patron, Copy class CopyAdmin(admin.ModelAdmin): actions = ["check_in_copys"] def check_in_copys(self, request, queryset): for q in queryset: q.check_in() self.message_user(request, "copy(s) checked in") check_in_copys.short_description = "Check in copy(s)" admin.site.register(Copy, CopyAdmin)

관리자 테마

기본적으로 Django는 관리자 패널에 상당히 간단한 스타일을 제공합니다. 자신만의 테마를 만들거나 타사 테마를 사용하여 관리자 패널을 새로운 모습으로 만들 수 있습니다. 인기 있는 오픈 소스 테마 중 하나는 글의 앞부분에서 설치한 grappelli입니다. 전체 기능에 대한 설명서를 확인할 수 있습니다.

테마 설치는 매우 간단하며 두 줄만 있으면 됩니다. 먼저 library/settings.py 에서 다음과 같이 INSTALLED_APPSgrappelli 를 추가합니다.

 INSTALLED_APPS = [ 'grappelli', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'records', ]

그런 다음 library/urls.py 를 조정합니다.

 from django.contrib import admin from django.urls import path, include from records import views urlpatterns = [ path('grappelli/', include('grappelli.urls')), path('admin/', admin.site.urls), path('', views.index), ]

이러한 변경 사항이 적용되면 관리자 패널은 다음과 같이 표시됩니다.

테마가 있는 관리자 패널. (큰 미리보기)

다른 많은 테마가 있으며 다시 자신만의 테마를 개발할 수 있습니다. 이 기사의 나머지 부분에서는 기본 모양을 고수하겠습니다.

모델 이해하기

이제 관리자 패널에 익숙해지고 이를 사용하여 데이터를 탐색할 수 있으므로 데이터베이스 구조를 정의하는 모델을 살펴보겠습니다. 각 모델은 관계형 데이터베이스에서 하나의 테이블을 나타냅니다.

관계형 데이터베이스는 하나 이상의 테이블에 데이터를 저장합니다. 이러한 각 테이블에는 기본 키(각 요소의 고유 식별자)와 문자열, 정수 및 날짜와 같은 다양한 유형의 값 열이 하나 이상 포함된 지정된 열 구조가 있습니다. 데이터베이스에 저장된 각 개체는 단일 행으로 표시됩니다. 이름의 "관계형" 부분은 틀림없이 이 기술의 가장 중요한 기능인 테이블 간의 관계 생성에서 유래했습니다. 개체(행)는 일대일, 일대다(외래 키) 또는 다른 테이블의 행에 대한 다대다 매핑을 가질 수 있습니다. 이에 대해서는 예제에서 더 논의할 것입니다.

Django는 기본적으로 개발을 위해 SQLite3를 사용합니다. SQLite3은 간단한 관계형 데이터베이스 엔진이며 python manage.py migrate 를 처음 실행할 때 데이터베이스가 자동으로 db.sqlite3 으로 생성됩니다. 이 기사에서는 SQLite3를 계속 사용하지만 주로 동시 사용자에게 덮어쓰기가 가능하기 때문에 프로덕션 용도에는 적합하지 않습니다. 프로덕션 환경에서 또는 언젠가 배포할 시스템을 작성할 때 PostgreSQL 또는 MySQL을 사용하십시오.

Django는 모델을 사용하여 데이터베이스와 인터페이스합니다. Django ORM의 일부를 사용하여 records/models.py 파일에는 여러 모델이 포함되어 있어 각 개체에 대한 필드, 속성 및 메서드를 지정할 수 있습니다. 모델을 만들 때 합리적인 범위 내에서 "Fat Model" 아키텍처를 위해 노력합니다. 즉, 가능한 한 많은 데이터 유효성 검사, 구문 분석, 처리, 비즈니스 로직, 예외 처리, 에지 케이스 해결 및 유사한 작업이 모델 자체의 사양에서 처리되어야 합니다. 내부적으로 Django 모델은 널리 유용한 기본 동작을 가진 매우 복잡하고 기능이 풍부한 객체입니다. 따라서 상당한 양의 코드를 작성하지 않고도 "Fat Model" 아키텍처를 쉽게 달성할 수 있습니다.

샘플 애플리케이션에서 세 가지 모델을 살펴보겠습니다. 이것은 Django 프레임워크의 완전한 문서가 아니라 소개 기사이기 때문에 모든 것을 다룰 수는 없지만 이 간단한 모델을 구성할 때 내가 선택한 가장 중요한 사항을 강조하겠습니다.

Book 클래스는 모델 중 가장 간단합니다. 다음은 records/models.py 에서 가져온 것입니다.

 from django.db import models class Book(models.Model): title = models.CharField(max_length=300) author = models.CharField(max_length=150) published = models.DateField() isbn = models.IntegerField(unique=True) def __str__(self): return self.title + " by " + self.author def make_copy(self): Copy.objects.create(book=self)

모든 CharField 필드에는 지정된 max_length 속성이 필요합니다. 기존의 길이는 150자인데, 제목이 매우 긴 경우 title 을 두 배로 늘렸습니다. 물론 여전히 초과할 수 있는 임의의 한도가 있습니다. 무제한 텍스트 길이의 경우 TextField 를 사용하십시오. published 필드는 DateField 입니다. 책이 출판된 시간은 중요하지 않지만 출판된 경우 DateTimeField 를 사용합니다. 마지막으로 ISBN은 정수이며(ISBN은 10 또는 13자리이므로 모두 정수의 최대 값에 맞습니다) 두 책이 동일한 ISBN을 가질 수 없으므로 unique=True 를 사용합니다. 이 ISBN은 데이터베이스 수준에서 적용됩니다.

모든 객체에는 문자열 표현을 정의하는 __str__(self) 메서드가 있습니다. 우리는 models.Model 클래스에서 제공하는 기본 구현을 재정의하고 대신 모델이 문자열로 표시되는 모든 위치에서 책을 "저자별 제목"으로 나타냅니다. 이전에 Book 의 관리 개체에서 list_display 를 사용하여 관리 패널의 목록에 표시할 필드를 결정했음을 상기하십시오. 해당 list_display 가 없으면 관리 목록은 대신 PatronCopy 모두에서와 같이 모델의 문자열 표현을 표시합니다.

마지막으로 이전에 작성한 관리 작업에서 호출한 Book 에 대한 메서드가 있습니다. 이 함수는 데이터베이스에 있는 Book 의 지정된 인스턴스와 관련된 Copy 을 만듭니다.

Patron 으로 이동하여 이 모델은 일대일 관계의 개념을 소개합니다. 이 경우에는 기본 제공 User 모델을 사용합니다. Records/models.py 에서 확인하십시오.

 from django.db import models from django.contrib.auth.models import User class Patron(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) address = models.CharField(max_length=150) dob = models.DateField() def __str__(self): return self.user.username

user 필드는 정확히 전단사 기능이 아닙니다. 연결된 Patron 인스턴스가 없는 User 인스턴스가 있을 수 있습니다. 그러나 User 는 둘 이상의 Patron 인스턴스와 연관될 수 없으며 Patron 은 사용자와 정확히 하나의 관계 없이 존재할 수 없습니다 . 이것은 데이터베이스 수준에서 시행되며 on_delete=models.CASCADE 사양에 의해 보장됩니다. User 인스턴스가 삭제되면 연결된 Profile 이 삭제됩니다.

다른 필드와 __str__(self) 함수는 이전에 본 적이 있습니다. 모델의 함수에서 속성(이 경우 user.username )을 가져오기 위해 일대일 관계를 통해 도달할 수 있다는 점은 주목할 가치가 있습니다.

데이터베이스 관계의 유용성을 확장하기 위해 Records/models.py 에서 Copy 에 주의를 기울이겠습니다.

 from django.db import models class Copy(models.Model): book = models.ForeignKey(Book, on_delete=models.CASCADE) out_to = models.ForeignKey(Patron, blank=True, null=True, on_delete=models.SET_NULL) def __str__(self): has_copy = "checked in" if self.out_to: has_copy = self.out_to.user.username return self.book.title + " -> " + has_copy def check_out(self, p): self.out_to = p self.save() def check_in(self): self.out_to = None self.save()

다시 말하지만, 우리는 이것의 대부분을 이전에 보았으므로 새로운 models.ForeignKey 에 집중합시다. Copy 은 단일 Book 이어야 하지만 도서관에는 각 BookCopy 이 여러 개 있을 수 있습니다. Book 는 카탈로그에 Copy 이 없는 도서관 없이 데이터베이스에 존재할 수 있지만 Copy 은 기본 Book 없이 존재할 수 없습니다.

이 복잡한 관계는 다음 줄로 표현됩니다.

 book = models.ForeignKey(Book, on_delete=models.CASCADE)

삭제 동작은 User 에 대한 Patron 의 동작과 동일합니다.

CopyPatron 의 관계는 약간 다릅니다. Copy 은 최대 한 Patron 에게 체크아웃할 수 있지만 각 Copy Patron 체크아웃할 수 있습니다. 그러나 이것은 영구적인 관계가 아니므로 Copy 이 체크아웃되지 않는 경우가 있습니다. PatronCopy 는 데이터베이스에서 서로 독립적으로 존재합니다. 한 인스턴스를 삭제해도 다른 인스턴스는 삭제되지 않아야 합니다.

이 관계는 여전히 외래 키의 사용 사례이지만 인수가 다릅니다.

 out_to = models.ForeignKey(Patron, blank=True, null=True, on_delete=models.SET_NULL)

여기에서 blank=True 를 사용하면 양식이 관계에 대한 값으로 None 을 허용하고 null=True 를 사용하면 데이터베이스에 있는 Copy 의 테이블에 있는 Patron 관계에 대한 열이 null 을 값으로 허용할 수 있습니다. Copy 가 체크아웃된 상태에서 Patron 인스턴스가 삭제된 경우 Copy 에서 트리거되는 삭제 동작은 Patron 필드를 null로 설정하여 Copy 를 그대로 유지하면서 관계를 끊는 것입니다.

동일한 필드 유형인 models.ForeignKey 는 객체 간의 매우 다른 관계를 표현할 수 있습니다. 예제에서 내가 깔끔하게 맞출 수 없는 한 가지 관계는 다대다 필드로, 이름에서 알 수 있듯이 각 인스턴스가 다른 많은 인스턴스와 관련될 수 있다는 점을 제외하고는 일대일 필드와 같습니다. 그리고 각각의 책이 여러 책을 저술한 여러 저자를 가질 수 있는 것과 같이 다른 많은 사람들과 다시 관련될 수 있습니다.

마이그레이션

데이터베이스가 모델에 표현된 내용을 어떻게 아는지 궁금할 수 있습니다. 내 경험에 따르면 마이그레이션은 그렇지 않을 때까지 매우 간단한 작업 중 하나입니다. 초보자를 위해 머그를 그대로 유지하는 방법은 다음과 같습니다. 마이그레이션에 대해 배우고 마이그레이션과 상호 작용하는 방법을 배우되 마이그레이션 파일을 수동으로 편집하지 않도록 하세요. 당신이 무엇을 하고 있는지 이미 알고 있다면 이 섹션을 건너뛰고 당신에게 적합한 것을 계속하십시오.

어느 쪽이든, 주제의 완전한 처리에 대한 공식 문서를 확인하십시오.

마이그레이션은 모델의 변경 사항을 데이터베이스 스키마의 변경 사항으로 변환합니다. 직접 작성할 필요는 없습니다. Django는 python manage.py makemigrations 명령을 사용하여 작성합니다. 새 모델을 만들거나 기존 모델의 필드를 편집할 때 이 명령을 실행해야 하지만 모델 메서드를 만들거나 편집할 때는 실행할 필요가 없습니다. 마이그레이션은 체인으로 존재하며 각 마이그레이션은 데이터베이스 스키마를 오류 없이 편집할 수 있도록 이전 마이그레이션을 참조한다는 점에 유의하는 것이 중요합니다. 따라서 프로젝트에서 공동 작업하는 경우 버전 제어에서 일관된 단일 마이그레이션 기록을 유지하는 것이 중요합니다. 미적용 마이그레이션이 있는 경우 서버를 실행하기 전에 python manage.py migrate 를 실행하여 적용합니다.

예제 프로젝트는 단일 마이그레이션인 records/migrations/0001_initial.py 와 함께 배포됩니다. 다시 말하지만, 이것은 자동으로 생성된 코드로 편집할 필요가 없으므로 여기에 복사하지 않겠습니다. 하지만 뒤에서 무슨 일이 일어나고 있는지 알고 싶다면 계속해서 살펴보세요.

비품

마이그레이션과 달리 고정 장치는 Django 개발의 일반적인 측면이 아닙니다. 나는 그것들을 기사와 함께 샘플 데이터를 배포하는 데 사용하며 다른 방법으로 사용한 적이 없습니다. 그러나 우리는 이전에 하나를 사용했기 때문에 주제를 소개해야 한다고 생각합니다.

일단 공식 문서는 주제에 대해 약간 얇습니다. 전반적으로 알아야 할 사항은 고정 장치가 내가 사용하는 JSON을 포함하여 다양한 형식으로 데이터베이스에서 데이터를 가져오고 내보내는 방법이라는 것입니다. 이 기능은 대부분 자동화된 테스트와 같은 작업을 돕기 위해 존재하며 백업 시스템이나 라이브 데이터베이스의 데이터를 편집하는 방법이 아닙니다. 또한 고정 장치는 마이그레이션으로 업데이트되지 않으며 호환되지 않는 스키마가 있는 데이터베이스에 고정 장치를 적용하려고 하면 실패합니다.

전체 데이터베이스에 대한 고정 장치를 생성하려면 다음을 실행하십시오.

 python manage.py dumpdata --format json > fixture.json

조명기를 로드하려면 다음을 실행하십시오.

 python manage.py loaddata fixture.json

결론

Django에서 모델을 작성하는 것은 큰 주제이며 관리자 패널을 사용하는 것은 또 다른 문제입니다. 3,000자 이내로 각각 소개하는 정도밖에 되지 않았습니다. 관리자 패널을 사용하면 모델이 작동하고 서로 관련되는 방식을 탐색할 수 있는 더 나은 인터페이스가 제공되어 데이터의 관계형 표현을 실험하고 개발할 수 있는 자신감을 갖게 되었기를 바랍니다.

시작하기 쉬운 곳을 찾고 있다면 Profile 처럼 User 로부터 상속받은 Librarian 모델을 추가해 보십시오. 더 많은 문제를 해결하려면 각 Copy 및/또는 Patron 에 대한 체크아웃 기록을 구현해 보십시오(이를 수행하는 방법에는 여러 가지가 있습니다).

Django Highlights는 Django에서 웹 개발의 중요한 개념을 소개하는 시리즈입니다. 각 기사는 프론트엔드 개발자와 디자이너가 코드베이스의 "나머지 절반"에 대해 더 깊이 이해할 수 있도록 돕기 위해 Django 개발 측면에 대한 독립 실행형 가이드로 작성되었습니다. 이 기사는 대부분 이론과 관례에 대한 이해를 돕기 위해 작성되었지만 Django 3.0으로 작성된 일부 코드 샘플이 포함되어 있습니다.

추가 읽기

다음 기사 및 문서에 관심이 있을 수 있습니다.

  • Django 하이라이트: 사용자 모델 및 인증(1부)
  • Django 하이라이트: 템플릿을 사용하면 줄바꿈(2부)
  • Django 하이라이트: 정적 자산 및 미디어 파일 랭글링(4부)
  • Django 관리자 문서
  • 장고 모델
  • Django 모델 필드 참조
  • Django 마이그레이션