Sayfalandırma uygulayarak Django uygulamanızın verimliliğini ve ölçeklenebilirliğini geliştirin. Başlamak için bilmeniz gereken her şey burada.
Sayfalandırma, büyük veri kümeleriyle uğraşırken kullanıcı deneyimini ve uygulama performansını iyileştirir. Yerinde bir sayfalandırma sistemi olmadan, uygulamanız çoğu zaman gecikme yaşayacaktır. Django ile, web uygulamanızı sayfalandırmak için yerleşik sayfalandırma desteğinden yararlanabilirsiniz.
Django'da Sayfalandırma Nasıl Çalışır?
Django'da sayfalandırma uygulamak, sınıf tabanlı mı yoksa işlev tabanlı görünümlerle mi çalıştığınıza bağlı olarak değişiklik gösterebilir. Tercih ettiğiniz yöntem ne olursa olsun, temel prensipler aynı kalır.
Django adlı bir sınıf kullanır. sayfa düzenleyici sayfalandırmayı uygulamak için. bu sayfa düzenleyici class, sayfalandırmanızı özelleştirmek için kullanabileceğiniz çeşitli yöntemler sağlar. Başlatırken sayfa düzenleyici sınıf, iki zorunlu parametre alır; sayfalandırılacak veriler ve sayfa başına gösterilecek öğe sayısı. bu
sayfa düzenleyici yetimler için son sayfada kalması gereken öğelerin minimum sayısını belirtmek üzere isteğe bağlı üçüncü bir parametre alır. Varsayılan olarak yetimlerin değeri 0'dır, yani tüm sayfalarda aynı sayıda öğe bulunur.Django sayfalandırılmış bir sayfanın URL'si şuna benzer: https://example.com/products/?page=3. bu sayfa URL'deki parametre Django'ya kullanıcının hangi sayfayı görmek istediğini söyler. Ayrıca, Django'nun o sayfa için verilerin hangi bölümünün görüntüleneceğini belirlemesine yardımcı olur.
Bu projede kullanılan kod bir GitHub deposu ve MIT lisansı altında ücretsiz olarak kullanabilirsiniz.
Sayfalandırma için Django Projenizi Kurun
Django'da sayfalandırma yapmadan önce, Django'yu yükleyin ve bilgisayarınıza kurun. Django'yu bilgisayarınıza kurduktan sonra verileriniz için bir uygulama ve model oluşturmalısınız. İşte kopyalayabileceğiniz basit bir model:
itibaren django.db içe aktarmak modeller
sınıfPostalamak(modeller. modeli):
başlık = modeller. CharField (maks_uzunluk=255)
yazar = modeller. CharField (maks_uzunluk=50)
içerik = modeller. Metin alanı('Mesaj İçeriği')
kesinlikle__str__(kendi):
geri dönmek self.title
Yukarıdaki model bir blog uygulaması içindir. Her blog yazısı için başlık, yazar ve içerik alanlarını tanımlar. Ayrıca, yönetici panelinde daha iyi bir kullanıcı deneyimi için gönderi başlığını döndüren bir yöntemi vardır.
Bu komutu çalıştırarak modelinizi geçirin:
python manager.py makemigrations && python manage.py göçü
Modelinizi taşıdıktan sonra şuraya gitmelisiniz: blog>admin.py kayıt olmak için Aşağıdaki kod, adlı bir modeli başarıyla kaydeder. Postalamak.
itibaren django.contrib içe aktarmak yönetici
itibaren .modeller içe aktarmak Postalamak # 'Post'u model adınızla değiştirin
admin.site.register (Gönder)
Ardından, bir süper kullanıcı oluşturun ve Django yönetici panelinize gönderiler ekleyin. Bir süper kullanıcı oluşturmak için şu komutu kullanın:
python manage.py süper kullanıcı oluşturur
Yukarıdaki komut, aşağıdaki resimde gösterilen süreçte size yol gösterecektir:
Bir süper kullanıcı oluşturduktan sonra, geliştirme sunucunuzu çalıştırın ve yönetici paneline gidin.
python manager.py çalıştırma sunucusu
Sunucunuz başladıktan sonra şuraya gidin: http://127.0.0.1:8000/admin, oturum açın ve birkaç gönderi ekleyin.
Ardından, yazılarınızı tarayıcıda işlemek için bir HTML şablonu oluşturun. Dosyanızı aşağıdaki dizinde oluşturun: your_app/templates/your_app_name/index.html. Nasıl şablon oluşturacağınızı bilmiyorsanız, okuyun Django'nun MVT mimarisine giriş kılavuzu.
İşlev Tabanlı Görünümde Django Sayfalandırma
Django, sınıf tabanlı görünümler veya işlev tabanlı görünümlerle uygulamalar oluşturmanıza olanak tanır. İşlev tabanlı bir görünüm kullanarak uygulamanızı sayfalandırmak için. Bu adımları takip et:
- aç senin görünümler.py dosyalayın ve içe aktarın sayfa düzenleyici sınıf.
itibaren django.core.paginator içe aktarmak sayfa düzenleyici
- Gönderileri HTML şablonunuzda işlemek için bir görüntüleme işlevi oluşturun.
itibaren django.kısayollar içe aktarmak işlemek
itibaren .modeller içe aktarmak Postalamak
itibaren django.core.paginator içe aktarmak sayfa düzenleyici
kesinlikleliste görünümü(rica etmek):
mesajlar = Post.objects.all()
geri dönmek render (istek, "blog/blog_list_view.html", {'gönderiler':gönderiler})
- Gönderilerinizi tarayıcıda göstermek için bir URL kalıbı oluşturun. Proje dizininizdeki URL modelini yapılandırarak başlayın. Aç urls.py proje düzeyinde dosya ve bunu ekleyin url kalıpları:
itibaren django.urls içe aktarmak katmak
url kalıpları = [
...,
yol('', katmak("blog.url'ler")),
]
Yukarıdaki kod parçacığında değiştirin Blog uygulamanızın adıyla. Bir proje ile bir uygulama arasında ayrım yapamıyorsanız, bilmelisiniz bir projenin Django'daki bir uygulamadan farkı nedir?.
Yukarıdaki yapılandırmayı yaptıktan sonra, bir urls.py uygulama dizininizdeki dosya (bu durumda, Blog klasörü) ve bu kod parçacığını ekleyin:
itibaren django.urls içe aktarmak yol
itibaren .Görüntüleme içe aktarmak liste görünümü
url kalıpları = [
yol('', liste_görünümü, ad='liste görünümü'),
]
Sunucunuzu çalıştırdığınızda ve şuraya gittiğinizde http://127.0.0.1:8000/, tarayıcı gönderilerinizi belirttiğiniz stil sayfasına göre görüntüler.
- Sayfalandırma mantığı eklemek için görünüm işlevinizi değiştirin. İşte bir örnek:
kesinlikleliste görünümü(rica etmek):
mesajlar = Post.objects.all()
sayfalandırılmış = Sayfalandırıcı (yayınlar, 3)
sayfa_numarası = istek. GET.get('sayfa') #URL'den istenen sayfa numarasını al
sayfa = paginated.get_page (page_number)
geri dönmek render (istek, "blog/blog_list_view.html", {'sayfa':sayfa})
Yukarıdaki kod parçacığı üç yeni değişken sunar: sayfalandırılmış, sayfa numarası, Ve sayfa. Her değişken aşağıdakileri yapar:
- bu sayfalandırılmış değişken başlatıldı sayfa düzenleyici sınıf. Bu senaryoda, sayfalandırılacak veriler sorgu kümesidir, gönderiler, ve alır 3 sayfa başına görüntülenecek öğe sayısı olarak.
- bu sayfa numarası değişkeni sayfa numarasını URL'den alır. Örneğin, içinde http://127.0.0.1:8000/?page=2, sayfa numarası 2'dir.
- bu sayfa değişkeni, oluşturulacak belirli sayfayı alır. sayfalandırılmış değişken.
Şimdiye kadar, Django sayfanızı sayfalandırmış olmalı. Bu resimde gösterilen URL biçimini kullanarak sayfalandırılmış belirli sayfalara gidebilirsiniz:
- Sayfalandırılmış sayfalarda gezinmeyi görüntülemek için HTML şablonunuzu değiştirin. Mevcut yöntemler kullanılarak sayfa düzenleyici class, sayfanızda basit gezinme oluşturmanıza olanak tanır. İşte ilk HTML kodunuzun altına ekleyebileceğiniz bir örnek:
{% if page.has_previous %}
<Ahref="?page={{page.previous_page_number}}"
class="btn btn-ikincil mx-NN">ÖncekiA>
{% endif %}<Ahref="?sayfa=1"sınıf="btn btn-ikincil">BirinciA>
{page.paginator.page_range %} içindeki sayı için %}
{% if num == page.number %}
<açıklık>{{ sayı }}açıklık>
{% başka %}
<Ahref="?page={{num}}"sınıf="btn btn-ikincil mx-2">
{{ sayı }}
A>
{% endif %}
{% endfor %}<Ahref="?page={{page.paginator.num_pages}}"sınıf="btn btn-ikincil mx-2">
Son
A>
{% if page.has_next %}
<Ahref="?page={{page.next_page_number}}"sınıf="btn btn-ikincil mx-2">
Sonraki
A>
{% endif %}
Yukarıdaki kod parçacığında, sayfalandırma gezintisinin nasıl görüneceğini belirlemek için koşullu ifadelerle birlikte aşağıdaki yöntemler kullanılır:
- has_previous: Bu yöntem döndürür Doğru sayfalandırılmış verilerde bir önceki sayfa varsa.
- önceki_sayfa_numarası: Bu yöntem önceki sayfanın değerini döndürür.
- sayfa aralığı: Bu yöntem, sayfalandırılmış verilerinizde kaç sayfa olduğunu bilmenizi sağlar.
- sayı: Bu yöntem, geçerli sayfanın değerini döndürür.
- sayfa_sayısı: Bu yöntem, toplam sayfa sayısını döndürür.
- has_sonraki: Bu işlev döndürür Doğru sayfalandırılmış verilerde bir sonraki sayfa varsa.
- sonraki_sayfa_numarası: Bu metod bir sonraki sayfanın değerini döndürür.
Sınıf Tabanlı Görünümde Django Sayfalandırma
Sınıf tabanlı bir görünümde, sınıfı içe aktarmanız ve başlatmanız gerekmez. sayfa düzenleyici sınıf. Sayfalandırmayı sınıf tabanlı bir görünümde uygulamak için, adında bir öznitelik belirtmelisiniz. sayfalandırma_tarafından. Uygulamanızı sınıf tabanlı bir görünümle sayfalandırmak için şu adımları izleyin:
- Sınıf tabanlı bir görünüm yazın ve sayfalandırma_tarafından bağlanmak. İşte basit bir örnek:
itibaren .modeller içe aktarmak Postalamak
itibaren django.views.generic içe aktarmak Liste görünümü
sınıfGönderi Listesi Görünümü(Liste görünümü):
model = gönderi
şablon_adı = "blog/blog_list_view.html"
bağlam_nesne_adı = 'sayfa'
sayfalandırma_by = 2
Yukarıdaki görünüm, daha önce yazılan işlev tabanlı görünümün sınıf tabanlı sürümüdür. Bu görünüm, Django'nun Liste görünümü sınıf, öğeleri listelemek için kullanılır. Gibi niteliklerle mantığını tanımlar. modeli, şablon adı, bağlam_nesne_adı, Ve sayfalandırma_tarafından. bu sayfalandırma_tarafından nitelik, sayfa başına kaç gönderi görüntüleneceğini belirler; bu durumda 2 gönderi.
- Görünümünüzü oluşturduktan sonra, urls.py kullanmak için dosya. İşte basit bir örnek:
itibaren .Görüntüleme içe aktarmak Gönderi Listesi Görünümü
url kalıpları = [
yol('', PostListView.as_view(), ad='liste görünümü'),
]
- Kullanmak için HTML şablonunuzu değiştirin sayfa_obj sayfalama için.
{% if page_obj.has_previous %}
<Ahref="?page={{page_obj.previous_page_number}}"
class="btn btn-ikincil mx-NN">ÖncekiA>
{% endif %}<Ahref="?sayfa=1"sınıf="btn btn-ikincil">BirinciA>
{page_obj.paginator.page_range %} içindeki sayı için %}
{% if num == page_obj.number %}
<açıklıksınıf="geçerli sayfa">{{ sayı }}açıklık>
{% başka %}
<Ahref="?page={{num}}"sınıf="btn btn-ikincil mx-2">
{{ sayı }}
A>
{% endif %}
{% endfor %}<Ahref="?page={{page_obj.paginator.num_pages}}"
class="btn btn-ikincil mx-NN">
Son
A>
{% if page.has_next %}
<Ahref="?page={{page_obj.next_page_number}}"
class="btn btn-ikincil mx-NN">
Sonraki
A>
{% endif %}
İşlev tabanlı görünüm için HTML şablonundan farklı olarak, bu şablon sayfa_obj yerine sayfa sayfa nesnesini temsil etmek için. Bu, Django'da sınıf tabanlı sayfalandırma için varsayılan davranıştır.
Uygulamanızı Ölçeklenebilir Hale Getirmek için Sayfalandırmayı Kullanın
Sayfalandırma, tek seferde daha küçük veri alt kümelerini alıp görüntüleyerek sunucunuz/veritabanınızdaki yükü azaltır. Sayfalandırma ile web sitelerinizin performansı artacaktır. Kullanıcılarınız da uygulamanızı kullanırken iyi bir deneyim yaşayacaktır.
Sınıf tabanlı görünümler, işlev tabanlı görünümlerle karşılaştırıldığında daha fazla zaman ve kod tasarrufu sağlar, ancak tercihinize ve proje özelliklerine bağlı olarak herhangi birini kullanabilirsiniz.