Django'nun Öne Çıkanları: Modeller, Yönetici ve İlişkisel Veritabanından Yararlanma (3. Kısım)

Yayınlanan: 2022-03-10
Hızlı özet ↬ Yönetici paneli, Django web çerçevesinin sağladığı en güçlü, esnek özelliklerden biridir ve anında kullanıma hazır işlevselliği sonsuz özelleştirme ile birleştirir. Bir kütüphane envanter sistemine dayalı örnek bir proje kullanarak, Django'da model oluşturma ve ilişkisel veritabanlarıyla etkileşim kurma hakkında bilgi edinmek için yönetici panelini kullanacağız.

Baş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:

  1. Django yönetici paneli o kadar sezgisel ki, onu nasıl kullanacağınızı zaten biliyorsunuz.
  2. 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.

Atlamadan sonra daha fazlası! Aşağıdan okumaya devam edin ↓

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ış:

Veri örneği. (Büyük önizleme)

Ö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:

Django Yönetici Paneli Ana Sayfası. (Büyük önizleme)

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.

Veri örneği. (Büyük önizleme)

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.

Kitap Oluştur (Büyük önizleme)

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.

Bir Patron Oluşturun. (Büyük önizleme)

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

Kopyalama Eylemi oluşturun. (Büyük önizleme)

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:

Temalı Admin Paneli. (Büyük önizleme)

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