Django Sayfalama Pagination

Düzgün örnek bulmak kolay olmadı bu yüzden bir kaç örneği birleştirip kendi siteme göre çözümlemeler yaptım. Örneği burada paylaşıyorum böylelikle sizlerde kendi sorunlarınızı çözebilirsiniz.

view.py de şunları yapıyoruz. tüm dosyayı kopyalamadım çünkü çok uzun sadece bahsi geçen kısım şöyle olacak:


#normal view modüllerine şu eklenecek
from django.core.paginator import Paginator,InvalidPage, EmptyPage

def index(request, page=1):
 list = pnews.objects.all().order_by('-pdate')
 paginator = Paginator(list, 5)
 
 try:
  results = paginator.page(page)
 except(InvalidPage, EmptyPage):
  results = paginator.page(paginator.num_pages)
  
 return render_to_response('news/homepage.html', {"results":results})

urls.py şu satırı ekledim:


url(r'^news/(?Pd+)/

Burada yazdığımız satır şu işe yarıyor urlmiz/news/1 şeklinde kaçıncı sayfadaysak onu gösteriyor.

template dosyamızı şu şekilde düzeltiyoruz:

 
{%if results.has_previous%}
previous
{%endif%}
Page {{results.number}} of {{results.paginator.num_pages}}

{%if results.has_next%}
next
{%endif%}

 

Burada toplam kaç sayfada olduğumuzu gösteriyoruz. Bulunduğumuz sayfanın öncesi varsa öncesine, sonrası varsa da sonrasına link veriyoruz. Normalde düz liste olunca 1 yazılırdı ama pagination yapınca 2 ile verileri çekiyoruz bunuda belirtmiş olayım.


{% for pnews in results %} 1

{% for pnews in results.object_list %} 2

Ek:Tagların bazıları görünmüyor mouse ile seçip urllere bakın elimden gelen bir şey yok bloggerdaanca bu kadar kod yazılıyor.

, 'cms.news.views.index', name='gmsnews'),

Burada yazdığımız satır şu işe yarıyor urlmiz/news/1 şeklinde kaçıncı sayfadaysak onu gösteriyor.

template dosyamızı şu şekilde düzeltiyoruz:


Burada toplam kaç sayfada olduğumuzu gösteriyoruz. Bulunduğumuz sayfanın öncesi varsa öncesine, sonrası varsa da sonrasına link veriyoruz. Normalde düz liste olunca 1 yazılırdı ama pagination yapınca 2 ile verileri çekiyoruz bunuda belirtmiş olayım.


Ek:Tagların bazıları görünmüyor mouse ile seçip urllere bakın elimden gelen bir şey yok bloggerdaanca bu kadar kod yazılıyor.

The Order Of The Stick


Paylaşacağım diğer bir web comic ilk başladığım seri olan order of the stick. Yıllardır yayında olan bu seri Rich Burlew’in elinden çıkmakta. Sitesi GiantITP aynı zamanda ErfWorld’ün birinci kitabına ev sahipliği yapmıştı. FRP ve DnD dünyasına eğlenceli bir şekilde yaklaşan seride aynı zamanda çok sağlam bir konu var. Bazı bölümler için efsanevi diyebilirim. Uzun yıllardır sürdüğü için karakterler bizden birisi gibi oldu. Konusunu kısaca anlatmak gerekirse bir grup kahraman kötü lichi durdurmak için maceraya başlarlar. Yolda önlerine gelen rakipleri aşarken onları bekleyen yeni düşmanlar ve tuzaklardan habersizdirler. Ama ne olursa olsun onlar bizi güldürmeyi hep başarır. Şuan 690. sayısı yayınlanmış durumda eğer başlamadıysanız başlayın hemen 🙂 Böylece muhabbet edecek daha çok konumuz olur.
Bu arada ufak bir not ürünlerini şu adresten (mesela son çıkacak kitabı) bulabilirsiniz. Kitabını alamıyorum bari reklamını yapayım yıllardır okuyoruz bir katkımız olsun.

Site – 3


3 oluyor bu daha önce 2 resim yayınlamıştım. Onların başlığı farklıydı ama olsun. Şimdi profil var, kayıt olunuyor, albüm var, iletişim formu var, rss desteği var, commentler var, news başlıklı bir dinamik içerik bölümü var istenirse başka da eklenir. sitemap eklenecek kolay iş o tüm içeriği tamamladıktan sonra halledeceğim. Başka ne gerekir buna? Sanırım tag özelliğini eklemem gerek SEO için de lazım oluyor. İşte temaya başladım, hazır bir tema kullanmak istemediğim için sıfırdan yazıyorum. Nerden başlasam diye bir an duraksamıştım sağolsunlar GimpTR sitesine güzel bir bölüm eklemişlerdi gimp ile web teması yapımıyla ilgili o yazı dizisi işimi gördü. Görselleri hazırlamadım sadece kodlarını tamamladım. Görsel işini arkadaşın tekine yıkmayı planlıyorum. 🙂 GimpTR‘yi uzun süredir takip ederim. Hani şu ülkede bu tarz kaç site var bilemiyorum. Açık kaynak bir program hakkında detaylı bilgi veriyorlar ve üstelik bunu çok iyi yapıyorlar, sağolsunlar. Neyse buyrun sitemin son hali. Sakın bunun şu bahsettiğim dizi/sinema portalı olduğunu sanmayın. Hoş onun içinde kullanabilirim ama bu sistemin daha çok pişmesi gerek.

Django URL kalıbını isimlendirme

Her belge için birer link ekleyeceğimi söylemiştim. Bun yapmak basit aslında öncelikle URL kalıbımızı(pattern) isimlendirmemiz gerekiyor mesela örnek olarak benimkileri yapıştırıyım buraya.
url(r’^news/$’, ‘cms.news.views.index’, name=’gmsnews’),
url(r’^news/(?Pd+)/$’, ‘cms.news.views.details’, name=’gmsdetails’),
Normalde url fonksiyonu içersinde kullanmıyoruz bu kalıpları ama isimlendireceğimiz zaman başına url koymamız gerekiyor. name atadıktan sonra template de istediğimiz şekilde bu urlleri çağırabiliriz. örneğin gmsdetails urlsi şu şekil çağrılıyor:
{%url gmsdetails pnews.id%}
Burada her id için sayfa atayacağı için id numarasınıda değişkenin içine yazmamız gerekiyor. Yazmazsak hata alırız. Normal gmsnews sayfasına dönmek içinse şunu yazıyoruz.
{%url gmsnews%}
Böylelikle uygulamama her haber bağlantısı için birer link ve ayrıntı sayfasınada geri dönüş linki eklemiş oldum. Aynı zamndan çaktırmadan da feed desteğini ekledim ama ondan bahsetmiyeceğim.

Django İle Bugünlük Bu Kadar


Basit bir şeye benziyor değil mi? Sanki düz htmlmiş gibi meret. Şimdilik görsellikle uğraşmadım onu ne sitesi olursa ona göre düzelteceğim. Bugün yaptıklarımı kısaca anlatmak gerekirse eski bir projemi tekrardan dirilttim. Hani şu yeşilli temalı bir blog projesi vardı resmini paylaşmıştım. İşte onu biraz daha geliştiriyorum. Dediğim gibi kodlara uzun süre bakmadığım için unutmuştum bir de başka bir özellik ekleyeceğim derken tüm sistemi dağıttım. Neyse sonradan düzelttim. Şimdi bundan böyle artık üye olabiliyoruz, üyeler giriş yapabiliyor çıkış yapabiliyor. Profillerini düzenleyebiliyorlar avatar yükleyebiliyorlar ama ben o özelliği kullanmayacağım. Sonracığıma statik sayfalar için bir modül vardı onu kaldırdım dediğim gibi hızlı olması için onları ayrı bir klasörde html olarak toplayıp nginx ile yayınlayacağım. Hmm sonra news sınıfıını geliştirdim biraz artık ana sayfada gönderenin adı ve saati yayınlanıyor otomatik. Bundan sonra comment ekleyeceğim. Sonra o sayfa başlıklarının ayrıntılı gözükmesi için başlıklara link vereceğim. Başka ne eklerim bilmiyorum ihtiyaç doğrultusunda bakacağız artık.

Herkese kolay gelsin.

Django Notları

Bugün eski projelerimden birisine bakmam gerekti. Daha önce friendfeed de bir link paylaşmıştım. Django hakkında 10 numara gibi bir şeydi ama paylaşmama rağmen kendimin bu numaraları kullanmadığımın farkına vardım. Kodları Linux’ta yazdığım için dizinleri tek tek linuxa göre yazmıştım. Windows’a gelince tabiki hiç biri çalışmadı. Bende aynı hatayı yapmamak için bu numaralardan birisini çektim. Böylece bundan böyle kodları hangi platforma taşırsam taşıyım çalışacaklar. Unutkanlığımdan kurtulmak için blogda paylaşıyorum böylelikle bir daha aynı hatayı yaparsam insanlar beni kınayabilecek 😛

neyse gelelim koda:

import os ile elbette os modülünü ekliyoruz settings.py dosyasına ondan sonra
SITE_ROOT = os.path.realpath(os.path.dirname(__file__)) satırını ekliyoruz. Böylelikle dosyamızın bulunduğu dizinin adresini alıyoruz.
Sonra artık ne için dizin gerekiyorsa bunun üzerine çalışıyoruz mesala bende templates dizinine girmem gerekiyordu şöyle girdim.
TEMPLATE_DIRS = (os.path.join(SITE_ROOT, ‘templates’),) virgüle dikkat edin.

Diğer bir husus DEBUG’ı sunucuya taşıdımızda False yapmaktı. Bunun için şöyle bir şey buldum:


import socket

if socket.gethostname() == 'xxx111.com':
    DEBUG = False
else:
    DEBUG = True

Burada da host name’i alıyoruz xxx111.com’sa cevap demek ki sunucuya yollamışız diyoruz ve False ediyoruz. Bu özelliği deneyemedim daha yanlışsa düzeltin beni.

Bir başka numara ki bence benim yaptığım en büyük hatalardan birisi buydu. Statik sayfaları apache’ye yüklettirmekti. Onlar için ayrı bir model bile yazmıştım oysa ne gerek var böyle bir şeye? Statik sayfa için admin paneli gerekmiyor herhangi bir editör ile html olarka oluşturup yayınlasak yeterli. Bunun için nginx kullanıp htmlleri onun üzerinden yayınlamak gerekiyormuş. Bunu sunuya geçtiğimde kullanacağım.

http://docs.djangoproject.com/en/dev/topics/cache/ sitesinde cache olayı anlatılmış uzun uzun. Ben memcached’ı gözüme kestirdim her ne kadar şuan ihtiyacım olmasada ilerde olabilir diye hazırda koda ekleme yapabilirim. Tabi böyle bazı şeyleri denemek ve performans farkını görmek için dolu bir içeriği sunucuda test etmem gerekiyor. DB de 100 veri varken göstereceği farkla 10000 veri varken göstereceği farkı anlamak gerek. Deneyen varsa yorum yapsın bizde bilelim. Ona göre diğer cache yöntemlerinden birisinide kullanabilirim.

Siteyi hızlandırmak için diğer bir yöntemde css ve js’leri sıkıştırmakmış. django-compress isimli bir modül aracılığıyla bu işlem yapılıyor. İki tane js’i sıkıştırsan ne olur sıkıştırmasan ne olur diyebilirsiniz ama django’yu hızlandırmak için yaptığım aramalarda bir kaç kişi bu özelliği anlatmış. Şimdi yine kullanıcı sayısıyla orantılı bir konu. Tek bir js bile olsa 100k kullanıcınız varsa bu yöntemler etkili olabilir. Ama ben sadece blog yazacam derseniz gerekmeyebiliyor. Bana göre basit bir blog dahi yazsakta (ki öyle bir site için 4-5 model bile yetiyor) işimizi düzgün yapıp bu teknikleri uygulamalıyız. İleride belki o uygulamayı başka bir tanesine ekleriz bilemezsiniz gelecekte ne olacağını.

Hız için diğer tavsiyeler apache ile alakalı onları başka bir yazıda paylaşırım. Birde auth modülüyle ilgili güzel örnekler var. Django’nun en sevdiğim özelliği kullanıcı girişi için ekstra bir çalışma yapmamanız. İsterseniz kendi login templateni bile kullanabiliyorsunuz. Başka platformlarda belki uzun uzun kodlar yazmanız gerekir login olabilmesi için kullanıcınızın, djangoda ise template 1-2 link ekliyorsunuz tamam iş.

Neyse, herkese iyi çalışmalar.

XAMPP, Vuze, Drupal ve Windows

Afyona geldiğimden haberiniz vardır. Elimde Windows kurulu eski bir laptop var. Çalışmalarım şu aralar Web’e kaysada çektiğim sıkıntıları ben bilirim. Metin editörü için NotePad++’ı kullanmaya başladım sorunlarımı onunla çözmüş oldum. Sonra Localhost için XAMPP ile Apache serverı kurdum. Yeni site projelerimizi denemek için güzel oldu. Sistem çok kastı ama yapacak bir şey yok. Ardından elbette izleyeceğim diziler için bir torrent programı aradım. BitTorrent ile garip maceralar yaşadım ve virüsleri oradan yeme ihtimalinden kıllandığım için önce Deluge’u denedim. Kurulum sırasında PyGame ile ilgili bir kaç dosya önümden geçti şaşırdım doğrusu. Deluge GTK2’yu kurdu ama ne hikmetse torrent ekleyemedim. Program çalışıyordu ama torrent eklenmiyordu. Basıyorum ekle düğmesine çalışmıyor…

Deluge’den sonra eski bir dost olan Azureus’u kurayım dedim. Adı değişmiş Vuze olmuş. Zaten ağır bir programı daha da ağırlaştırmışlar. 30MB java runtime indirdi ama sorunsuz çalıştı. Sayesinde Stargate Universe’ün yeni bölümünü hızlıca indirip izledim. Sonrasında Drupal’ı indirdim. Gayet güzel sevilen bir CMS ve şimdilik bir projem için yeterli görünüyor. Kurulum sırasında hata verdi PHP bilmeyen ben kurulum dosyalarını açıp hatayı düzelttim. default_settings dosyasını settings.php’ye dönüştürüyoruz oysa kurulum için gerekli dosya eski haliyle arama yapıyor. Hata verilen satırda dosya ismini düzelttiğinizde sorun ortadan kalkıyor ve kurulum tamamlanıyor. Pek sade pek şeker bir sisteme sahip. Hoşuma gitti üzerinde biraz çalışabilirim.