Django'nun Öne Çıkanları: Modeller, Yönetici ve İlişkisel Veritabanından Yararlanma (3. Kısım)
Yayınlanan: 2022-03-10Başlamadan önce, Django'nun yerleşik yönetim yeteneklerinin, özelleştirmeden sonra bile son kullanıcılar için tasarlanmadığını belirtmek isterim. Yönetici paneli, yazılım oluşturmak ve sürdürmek için bir geliştirici, operatör ve yönetici aracı olarak bulunur. Geliştirdiğiniz platform üzerinden son kullanıcılara moderatörlük yetenekleri veya başka herhangi bir yönetici yeteneği kazandırmak için kullanılmaz.
Bu makale iki bölümden oluşan bir hipoteze dayanmaktadır:
- Django yönetici paneli o kadar sezgisel ki, onu nasıl kullanacağınızı zaten biliyorsunuz.
- Django yönetici paneli o kadar güçlüdür ki, bir Django modeli kullanarak ilişkisel bir veritabanında verileri temsil etmeyi öğrenmek için bir araç olarak kullanabiliriz.
Bu fikirleri, yönetici panelinin daha güçlü yeteneklerini etkinleştirmek için hala bazı yapılandırma kodları yazmamız gerekeceğini ve yine de verilerin temsilini belirtmek için Django'nun model tabanlı ORM'sini (nesne-ilişkisel eşleme) kullanmamız gerekeceğini ihtar ederek sunuyorum. bizim sistemimizde.
Önerilen Kaynaklar
“Django Öne Çıkanlar”, Django'da web geliştirmenin önemli kavramlarını tanıtan bir dizidir. Güvenli kullanıcı kimlik doğrulama akışları sağlama hakkında bilgi edinmek ve karmaşık sayfalar yazmak için Django şablonunu kullanmayla ilgili bir gösteriyi takip etmek isteyebilirsiniz.
Kurulum
Bu yazıda örnek bir proje ile çalışacağız. Proje, bir kütüphanenin kitapları ve kullanıcıları hakkında depolayacağı bazı verileri modeller. Örnek, kullanıcıları ve/veya envanteri yöneten birçok sistem türü için oldukça uygulanabilir olmalıdır. İşte verilerin nasıl göründüğüne dair kısa bir bakış:
Örnek kodun yerel makinenizde çalışmasını sağlamak için lütfen aşağıdaki adımları tamamlayın.
1. Paketlerin Kurulması
Python 3.6 veya üstü yüklüyken bir dizin ve sanal ortam oluşturun. Ardından, aşağıdaki paketleri kurun:
pip install django django-grappelli
Django, bu makalede üzerinde çalıştığımız web çerçevesidir. ( django-grappelli
, kısaca değineceğimiz bir yönetici paneli temasıdır.)
2. Projeyi Almak
Önceki paketler kuruluyken, örnek kodu GitHub'dan indirin. Koşmak:
git clone https://github.com/philipkiely/library_records.git cd library_records/library
3. Bir Süper Kullanıcı Oluşturma
Aşağıdaki komutları kullanarak veritabanınızı kurun ve bir süper kullanıcı oluşturun. Komut satırı arayüzü, bir süper kullanıcı oluşturma sürecinde size yol gösterecektir. Süper kullanıcı hesabınız, bir anda yönetici paneline nasıl erişeceğinize bağlı olacaktır, bu nedenle belirlediğiniz şifreyi hatırladığınızdan emin olun. Kullanmak:
python manage.py migrate python manage.py createsuperuser
4. Verilerin Yüklenmesi
Araştırmamız için, veritabanına yükleyebileceğiniz fikstür adında bir veri seti oluşturdum (bir fikstürün nasıl oluşturulacağı hakkında daha fazla bilgi için makalenin sonunda). Yönetici panelinde keşfetmeden önce veritabanınızı doldurmak için fikstürü kullanın. Koşmak:
python manage.py loaddata ../fixture.json
5. Örnek Projeyi Çalıştırmak
Son olarak, örnek kodu çalıştırmaya hazırsınız. Sunucuyu çalıştırmak için aşağıdaki komutu kullanın:
python manage.py runserver
Projeyi görüntülemek için tarayıcınızı https://127.0.0.1:8000 olarak açın. /admin/ adresindeki yönetici paneline otomatik olarak yönlendirileceğinizi unutmayın. Bunu library/urls.py dosyasında aşağıdaki yapılandırmayla başardım:
from django.contrib import admin from django.urls import path from records import views urlpatterns = [ path('admin/', admin.site.urls), path('', views.index), ]
record/views.py dosyasında aşağıdaki basit yönlendirmeyle birlikte:
from django.http import HttpResponseRedirect def index(request): return HttpResponseRedirect('/admin/')
Yönetici Panelini Kullanma
Biz başardık! Sayfanızı yüklediğinizde aşağıdakine benzer bir şey görmelisiniz:
Bu görünüm, record/admin.py dosyasında aşağıdaki ortak kod ile gerçekleştirilir:
from django.contrib import admin from .models import Book, Patron, Copy admin.site.register(Book) admin.site.register(Copy) admin.site.register(Patron)
Bu görünüm, sistemin depoladığı veriler hakkında size bir ilk anlayış sağlamalıdır. Gizemin bir kısmını kaldıracağım: Groups
ve Users
Django tarafından tanımlanır ve sistemdeki hesaplar için bilgi ve izinleri depolar. Bu serinin önceki bir makalesinde User
modeli hakkında daha fazla bilgi edinebilirsiniz. Books
, Copys
ve Kullanıcılar, geçişleri çalıştırırken oluşturduğumuz ve Patrons
yükleyerek doldurduğumuz veritabanındaki tablolardır. Django'nun yanlış yazım olduğu "kopyalar" gibi durumlarda bile "s" ekleyerek model adlarını safça çoğullaştırdığını unutmayın.
Projemizde Book
, adı, yazarı, yayın tarihi ve ISBN (Uluslararası Standart Kitap Numarası) olan bir kayıttır. Kütüphane, her Book
bir Copy
veya muhtemelen birden fazlasını bulundurur. Her Copy
bir Patron
tarafından ödünç alınabilir veya halihazırda iade edilebilir. Bir Patron
, adresini ve doğum tarihini kaydeden User
bir uzantısıdır.
Oluşturun, Okuyun, Güncelleyin, Yok Edin
Yönetici panelinin standart bir özelliği, her modelin örneklerini eklemektir. Modelin sayfasına gitmek için “kitaplar”a tıklayın ve sağ üst köşedeki “Kitap Ekle” butonuna tıklayın. Bunu yapmak, bir kitap oluşturmak için doldurup kaydedebileceğiniz bir form açacaktır.
Bir Patron
oluşturmak, yöneticinin oluşturma formunun başka bir yerleşik özelliğini ortaya çıkarır: bağlı modeli doğrudan aynı formdan oluşturabilirsiniz. Aşağıdaki ekran görüntüsü, User
açılır menüsünün sağındaki yeşil artı işaretiyle tetiklenen açılır pencereyi gösterir. Böylece aynı admin sayfasında her iki modeli de oluşturabilirsiniz.
Aynı mekanizma ile bir COPY
oluşturabilirsiniz.
Her kayıt için, aynı formu kullanarak düzenlemek için satırı tıklayabilirsiniz. Ayrıca bir yönetici eylemi kullanarak kayıtları silebilirsiniz.
Yönetici İşlemleri
Yönetici panelinin yerleşik yetenekleri oldukça kullanışlı olsa da, yönetici eylemlerini kullanarak kendi araçlarınızı oluşturabilirsiniz. İki tane oluşturacağız: biri kitapların kopyalarını oluşturmak için, diğeri de kütüphaneye iade edilen kitapları teslim etmek için.
Bir Book
Copy
oluşturmak için /admin/records/book/
URL'sine gidin ve "Eylem" açılır menüsünü kullanarak "Kitapların bir kopyasını ekle"yi seçin ve ardından sol sütundaki onay kutularını kullanın. Envantere hangi kitabın veya kitapların bir kopyasının ekleneceğini seçmek için tablonun
Bunu oluşturmak, daha sonra ele alacağımız bir model yöntemine dayanır. Kayıtlar/admin.py içinde Profile
modeli için aşağıdaki gibi bir ModelAdmin
sınıfı oluşturarak admin action olarak adlandırabiliriz:
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
özelliği, modelin genel bakış sayfasında modeli temsil etmek için hangi alanların kullanıldığını belirtir. actions
özelliği, yönetici işlemlerini listeler. Yönetici eylemimiz BookAdmin
içinde bir işlev olarak tanımlanır ve üç argüman alır: yönetici nesnesinin kendisi, istek (istemci tarafından gönderilen gerçek HTTP isteği) ve sorgu kümesi (kutuları işaretlenen nesnelerin listesi). Aynı işlemi sorgu kümesindeki her bir öğe üzerinde gerçekleştiriyoruz ve ardından işlemlerin tamamlandığını kullanıcıya bildiriyoruz. Her yönetici eylemi, açılır menüde doğru bir şekilde tanımlanabilmesi için kısa bir açıklama gerektirir. Son olarak, modeli kaydederken şimdi BookAdmin
.
Özellikleri toplu olarak ayarlamak için yönetici eylemleri yazmak oldukça tekrarlayıcıdır. İşte bir Copy
kontrol etmek için kod, önceki eylemle neredeyse eşdeğer olduğuna dikkat edin.
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)
Yönetici Teması
Varsayılan olarak Django, yönetici paneli için oldukça basit stiller sağlar. Yönetici paneline yeni bir görünüm kazandırmak için kendi temanızı oluşturabilir veya üçüncü taraf bir tema kullanabilirsiniz. Popüler bir açık kaynaklı tema, makalenin başlarında yüklediğimiz grappelli'dir. Tam yetenekleri için belgelere göz atabilirsiniz.
Temayı yüklemek oldukça basittir, sadece iki satır gerektirir. İlk olarak, library/settings.py içinde INSTALLED_APPS
grappelli
ekleyin:
INSTALLED_APPS = [ 'grappelli', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'records', ]
Ardından library/urls.py öğesini ayarlayın:
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), ]
Bu değişiklikler yapıldığında, yönetici paneli aşağıdaki gibi görünmelidir:
Dışarıda bir dizi başka tema var ve yine kendi temanızı geliştirebilirsiniz. Bu makalenin geri kalanı için varsayılan görünüme bağlı kalacağım.
Modelleri Anlamak
Artık yönetici panelinden ve verilerde gezinmek için kullandığınızdan emin olduğunuza göre, şimdi veritabanı yapımızı tanımlayan modellere bir göz atalım. Her model, ilişkisel bir veritabanında bir tabloyu temsil eder.
İlişkisel bir veritabanı, verileri bir veya daha fazla tabloda depolar. Bu tabloların her biri, bir birincil anahtar (her öğe için benzersiz bir tanımlayıcı) ve dizeler, tamsayılar ve tarihler gibi çeşitli türlerde bir veya daha fazla değer sütunu dahil olmak üzere belirli bir sütun yapısına sahiptir. Veritabanında depolanan her nesne, tek bir satır olarak temsil edilir. Adın “ilişkisel” kısmı, teknolojinin tartışmasız en önemli özelliğinden geliyor: tablolar arasında ilişkiler yaratmak. Bir nesne (satır), bire bir, bire-çok (yabancı anahtar) veya diğer tablolardaki satırlarla çoktan çoğa eşlemeye sahip olabilir. Bunu örneklerde daha ayrıntılı tartışacağız.
Django, varsayılan olarak geliştirme için SQLite3'ü kullanır. SQLite3 basit bir ilişkisel veritabanı motorudur ve veritabanınız python manage.py migrate
Manage.py Migration'ı ilk çalıştırdığınızda otomatik olarak db.sqlite3 olarak oluşturulur. Bu makale için SQLite3 ile devam edeceğiz, ancak üretim kullanımı için uygun değil, çünkü eşzamanlı kullanıcılarla üzerine yazmalar mümkün. Üretimde veya bir gün dağıtmayı düşündüğünüz bir sistemi yazarken PostgreSQL veya MySQL kullanın.
Django, veritabanıyla arayüz oluşturmak için modelleri kullanır. Django'nun ORM'sinin bir bölümünü kullanan record/models.py dosyası, her nesne için alanlar, özellikler ve yöntemler belirlemeye izin veren birden çok model içerir. Modelleri oluştururken makul ölçülerde “Şişman Model” mimarisi için çalışıyoruz. Bu, veri doğrulama, ayrıştırma, işleme, iş mantığı, özel durum işleme, uç durum çözümü ve benzer görevlerin mümkün olduğunca modelin kendi belirtiminde ele alınması gerektiği anlamına gelir. Kaputun altında, Django modelleri çok karmaşık, yaygın olarak yararlı varsayılan davranışa sahip özellikli nesnelerdir. Bu, önemli miktarda kod yazmadan bile “Fat Model” mimarisinin elde edilmesini kolaylaştırır.
Örnek uygulamamızdaki üç modeli inceleyelim. Bunun Django çerçevesinin tam belgeleri değil, bir giriş makalesi olması gerektiği için her şeyi ele alamayız, ancak bu basit modelleri oluştururken yaptığım en önemli seçimleri vurgulayacağım.
Book
sınıfı, modellerin en basitidir. İşte record/models.py adresinden :
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)
Tüm CharField
alanları, belirtilen bir max_length
özniteliği gerektirir. Geleneksel uzunluk, çok uzun başlıklar olması durumunda title
için ikiye katladığım 150 karakterdir. Tabii ki, hala aşılabilecek keyfi bir sınır var. Sınırsız metin uzunluğu için bir TextField
kullanın. published
alan bir DateField
. Kitabın yayınlandığı zaman önemli değil, ama olsaydı DateTimeField
kullanırdım. Son olarak, ISBN bir tamsayıdır (ISBN'ler 10 veya 13 basamaklıdır ve bu nedenle tümü tamsayının maksimum değerine sığar) ve iki kitap aynı ISBN'ye sahip olamayacağından unique=True
kullanırız ve bu daha sonra veritabanı düzeyinde uygulanır.
Tüm nesnelerin, dize temsillerini tanımlayan bir __str__(self)
yöntemi vardır. Modeller tarafından sağlanan varsayılan uygulamayı geçersiz models.Model
ve bunun yerine kitapları, modelin bir dize olarak temsil edileceği her yerde “yazarın başlığı” olarak temsil ederiz. Daha önce, yönetici panelinin listesinde hangi alanların gösterileceğini belirlemek için Book
admin nesnesinde list_display
kullandığımızı hatırlayın. Bu list_display
mevcut değilse, yönetici listesi bunun yerine hem Patron
hem de Copy
için olduğu gibi modelin dize temsilini gösterir.
Son olarak, Book
üzerinde daha önce yazdığımız yönetici işleminde çağırdığımız bir yöntemimiz var. Bu işlev, veritabanındaki belirli bir Book
örneğiyle ilişkili bir Copy
oluşturur.
Patron
, bu model, bu durumda yerleşik User
modeliyle bire bir ilişki kavramını tanıtır. Records/models.py adresinden kontrol edin:
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
alanı tam olarak bijektif bir işlev değildir. İlişkili bir Patron
örneği olmayan bir User
örneği OLABİLİR. Ancak, bir User
birden fazla Patron
Patron
ilişkilendirilemez ve bir Kullanıcı, bir kullanıcıyla tam olarak bir ilişki olmadan var olamaz . Bu, veritabanı düzeyinde uygulanır ve on_delete=models.CASCADE
belirtimi tarafından garanti edilir: bir User
örneği silinirse, ilişkili bir Profile
silinir.
Daha önce gördüğümüz diğer alanlar ve __str__(self)
işlevi. Bir modelin fonksiyonlarında, bu durumda user.username
özniteliklerini elde etmek için bire bir ilişki yoluyla ulaşabileceğinizi belirtmekte fayda var.
Veritabanı ilişkilerinin kullanışlılığını genişletmek için dikkatimizi Copy
from record/models.py konusuna çevirelim :
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()
Yine, bunların çoğunu daha önce gördük, bu yüzden yeni şeylere odaklanalım: models.ForeignKey
. Bir Copy
tek bir Book
ait olmalıdır, ancak kütüphanede her Book
birden fazla Copy
olabilir. Bir Book
, kütüphanenin kataloğunda bir Copy
olmadan veritabanında var olabilir, ancak bir Copy
, altında yatan bir Book
olmadan var olamaz.
Bu karmaşık ilişki şu satırla ifade edilir:
book = models.ForeignKey(Book, on_delete=models.CASCADE)
Patron
davranışı Kullanıcı ile ilgili olarak User
davranışı ile aynıdır.
Bir Copy
ve bir Kullanıcı arasındaki Patron
biraz farklıdır. Bir Copy
, bir Kullanıcıya kadar Patron
Patron
, ancak her Kullanıcı, kitaplığın izin verdiği kadar Copy
satın alabilir. Ancak bu kalıcı bir ilişki değildir, Copy
bazen kontrol edilmez. Patron
ve Copy
veritabanında birbirinden bağımsız olarak bulunur; birinin bir örneğini silmek, diğerinin herhangi bir örneğini silmemelidir.
Bu ilişki hala yabancı anahtar için bir kullanım durumudur, ancak farklı argümanlarla:
out_to = models.ForeignKey(Patron, blank=True, null=True, on_delete=models.SET_NULL)
Burada, blank=True
olması, formların ilişki değeri olarak None
kabul etmesine ve null=True
, Copy
'nin veritabanındaki Tablosundaki Patron
ilişkisi sütununun null
değerini bir değer olarak kabul etmesine izin verir. Bir Kullanıcı örneği, o Copy
teslim alınırken silinirse, bir Copy
üzerinde tetiklenecek olan silme davranışı, Patron
alanını boş olarak ayarlayarak Copy
olduğu gibi bırakırken ilişkiyi Patron
.
Aynı alan türü, models.ForeignKey
, nesneler arasında çok farklı ilişkileri ifade edebilir. Örneğe tam olarak sığdıramadığım tek ilişki, bire bir alana benzeyen çoktan çoğa bir alandır, ancak adından da anlaşılacağı gibi, her bir örnek diğer birçok örnekle ilişkili olabilir. ve her biri ve bunların her biri, bir kitabın nasıl her biri birden fazla kitap yazmış birden fazla yazara sahip olabileceği gibi, diğer birçok kişiyle ilişkilendirilebilir.
Göçler
Veritabanının modelde neyin ifade edildiğini nasıl bildiğini merak ediyor olabilirsiniz. Tecrübelerime göre, göçler, öyle olmayana kadar oldukça basit olan şeylerden biridir ve sonra yüzünüzü yerler. Yeni başlayanlar için kupanızı nasıl sağlam tutacağınız aşağıda açıklanmıştır: taşıma işlemleri ve bunlarla nasıl etkileşime geçileceği hakkında bilgi edinin, ancak taşıma dosyalarında manuel düzenlemeler yapmaktan kaçının. Ne yaptığınızı zaten biliyorsanız, bu bölümü atlayın ve sizin için neyin işe yaradığını takip edin.
Her iki durumda da, konunun tam bir tedavisi için resmi belgelere bakın.
Geçişler, bir modeldeki değişiklikleri veritabanı şemasındaki değişikliklere dönüştürür. Bunları kendiniz yazmak zorunda değilsiniz, Django onları python manage.py makemigrations
komutuyla oluşturur. Yeni bir model oluşturduğunuzda veya mevcut bir modelin alanlarını düzenlediğinizde bu komutu çalıştırmalısınız, ancak model yöntemlerini oluştururken veya düzenlerken buna gerek yoktur. Geçişlerin bir zincir olarak var olduğunu, her birinin bir öncekine referans verdiğini ve böylece veritabanı şemasında hatasız düzenlemeler yapabileceğini unutmamak önemlidir. Bu nedenle, bir proje üzerinde işbirliği yapıyorsanız, sürüm kontrolünde tek bir tutarlı geçiş geçmişi tutmak önemlidir. Uygulanmayan taşıma işlemleri olduğunda, sunucuyu çalıştırmadan önce bunları uygulamak için python manage.py migrate
çalıştırın.
Örnek proje, tek bir geçiş ile dağıtılır, record/migrations/0001_initial.py . Yine, bu, düzenlemeniz gerekmeyen otomatik olarak oluşturulmuş bir koddur, bu yüzden onu buraya kopyalamayacağım, ancak sahne arkasında neler olup bittiğine dair bir fikir edinmek istiyorsanız, devam edin ve bir göz atın.
Armatürler
Geçişlerden farklı olarak, fikstürler Django geliştirmenin ortak bir yönü değildir. Bunları makalelerle örnek verileri dağıtmak için kullanıyorum ve başka türlü kullanmadım. Ancak daha önce kullandığımız için konuyu tanıtma gereği duydum.
Bir kez olsun, resmi belgeler konuyla ilgili biraz zayıf. Genel olarak, bilmeniz gereken şey, fikstürlerin, benim kullandığım JSON da dahil olmak üzere, veritabanınızdan çeşitli biçimlerde veri alma ve verme yöntemi olduğudur. Bu özellik çoğunlukla otomatik test gibi şeylere yardımcı olmak için vardır ve bir yedekleme sistemi veya canlı bir veritabanındaki verileri düzenlemenin bir yolu değildir. Ayrıca, fikstürler geçişlerle güncellenmez ve uyumsuz bir şemaya sahip bir veritabanına bir fikstür uygulamaya çalışırsanız başarısız olur.
Tüm veritabanı için bir fikstür oluşturmak için şunu çalıştırın:
python manage.py dumpdata --format json > fixture.json
Bir fikstür yüklemek için şunu çalıştırın:
python manage.py loaddata fixture.json
Çözüm
Django'da model yazmak çok büyük bir konudur ve yönetici panelini kullanmak başka bir konudur. 3000 kelimeyle, sadece her birini tanıtmayı başardım. Umarım, yönetici panelini kullanmak, modellerin nasıl çalıştığını ve birbirleriyle nasıl ilişkili olduğunu keşfetmeniz için size daha iyi bir arayüz sunmuş ve size kendi ilişkisel veri temsillerinizi deneme ve geliştirme güvenini bırakmıştır.
Başlamak için kolay bir yer arıyorsanız, User
like Profile
miras alan bir Librarian
modeli eklemeyi deneyin. Daha fazla zorluk için, her Copy
ve/veya Kullanıcı için bir ödeme geçmişi uygulamayı deneyin (bunu Patron
birkaç yolu vardır).
Django Highlights, Django'da web geliştirmenin önemli kavramlarını tanıtan bir seridir. Her makale, ön uç geliştiricilerin ve tasarımcıların kod tabanının "diğer yarısı" hakkında daha derin bir anlayışa ulaşmalarına yardımcı olmayı amaçlayan Django geliştirmesinin bir yönüne yönelik bağımsız bir kılavuz olarak yazılmıştır. Bu makaleler çoğunlukla teori ve gelenek hakkında bir anlayış kazanmanıza yardımcı olmak için oluşturulmuştur, ancak Django 3.0'da yazılmış bazı kod örneklerini içerir.
Daha fazla okuma
Aşağıdaki makaleler ve belgeler ilginizi çekebilir.
- Django'da Öne Çıkanlar: Kullanıcı Modelleri ve Kimlik Doğrulama (Bölüm 1)
- Django'da Öne Çıkanlar: Şablon Oluşturma Satırları Kaydediyor (2. Kısım)
- Django'nun Öne Çıkanları: Statik Varlıkları ve Medya Dosyalarını Uğraşmak (4. Kısım)
- Django Yönetici Belgeleri
- Django Modelleri
- Django Modeli Alan Referansı
- Django Göçleri