
Django , Python programlama dili kullanılarak geliştirilmiş açık kaynak kodlu bir web frameworktur.
Django'nun kurulumu , Orm yapısı ile kullanımı ve debug (hata yakalama) işlemi çok rahattır.
Django hızlı ürün çıkarmaya odaklıdır. Yazılım geliştirme sürecinde insanları yormadan ürün geliştirmeye odaklamıştır.
Güvenilirliğe oldukça önem vermektedir.
MVT ( MODEL VİEW TEMPLATE ) yapısı ile hareket etmektedir.
DONT REPEAT YOURSELF bir şeyi tekrar etmeme mantığıyla hareket etmektedir. Bir defa oluştur defalarca kullan yöntemi ile ilerlemektedir.
Appler, Djangoda modüler kod yazmamıza olanak sağlıyan yapılardır. Böylece kendi içinde yapıyı oluşturup dışarıya import edip kullanmak için appler kullanılabilir yapılardır. Django projelerinin olmazsa olmazlarından biridir.
Bu ders ile birlikte viewlara giriş yapmış olduk. Ayrıca HttpResponse fonksiyonu ile boş bir sayfa geriye döndürdük. Viewler geriye mutlaka HttpResponse türünde bir nesne döndürürler bizde bu kısımda en basit haliyle bir nesne geriye döndürdük.
İnclude fonksiyonu applerimize ait url adreslerimizi ana urls.py dosyamıza ekler ve bu bellekte yer tutmanın önüne geçer
Regular Expressions ( Düzenli ifadeler ) ile string degerlere kısıtlama ve kural atamamıza yardım eden yapıdır. Django 1.10'da url tanımlamalarında regex ifadeler kullanıldığı için bu konu hakkında detaylı bir örnek mantığı anlamamıza yardımcı olacaktır.
Bu kısımd modellere giriş yapılmıştır.
Model dediğimiz yapılar veritabanındaki tablolara ve tabloların alanlarına sahip olan yapılardır .Djangoda tablo ve alanları oluşturulmadan önce model oluşturulur ve veritabanına aktarılır .
Veritabanına aktarma işlemi için python manage.py makemigrations ve python manage.py migrate komutları kullanılır. Aynı şekilde ekleme ,silme, okuma , detay gibi bilgiler bu model aracılığla elde edilir.
Model dediğimiz yapılar veritabanındaki tablolara ve tabloların alanlarına sahip olan yapılardır .Djangoda tablo ve alanları oluşturulmadan önce model oluşturulur ve veritabanına aktarılır .
Veritabanına aktarma işlemi için python manage.py makemigrations ve python manage.py migrate komutları kullanılır. Aynı şekilde ekleme ,silme, okuma , detay gibi bilgiler bu model aracılığla elde edilir.
Bu kısımda modelin django admin panelinde kullanması için yapılması gereken adımlar anlatılmıştır.
Djangoda admin paneline erişmek için superuser dediğimiz kullanıcı türü bulunmaktadır . Bu kullanıcı türü
python manage.py createsuperuser diyerek oluşmaya başlamaktadır. Bu kullanıcı tüm yetkilere sahip olmakla birlikte sistemdeki en yetkin kullancıdır.
Aynı zamanda bu derste oluşturulan modeli admin sayfasında nasıl kullandığımıza yönelik bilgiler verilmiştir.
ORM NEDİR SORUSUNUN YANITI
Nesne-İlişkisel Eşleme, nesne tabanlı programlama dilleri yapısına uygun olmayan katı veritabanı sorguları yerine veritabanı yapısının bir nesne gibi düşünülerek yazılım geliştirilmesine olanak sağlayan programlama teknolojisidir. Vikipedi
Ayrıca bu kısımda oluşturduğumuz modelimize ait bir nesneyi veritabanına kayıt etme işlemi gerçekleştirilecektir.
models.object.get yapısı ile djangoda filter , all ve exlude fonksiyonlarından farklı olarak tek bir nesne dönderme imkanı sağlıyor
Bu kısımda render fonksiyonu ile viewda istediğimiz bir .html uzantılı dosyasıyı ekranda gösterme işlemini ve render fonkisyonun context özelliğine değişken aktararak template kısımda kullanma işlemi ele alınacaktır.
Bu kısımda template diline ait olan if ve for taglarının kullanımı ele alındı.
Bu kısımda djangoda static dosyalar olarak isimlendirdiğimiz javasciprt , css , resim dosyalarımızın sistemde nasıl tuttuğumuza ve nasıl kullandığımıza dair işlemler gerçekleştirilmiştir.
Bu kısımda static dosya ayarlamarından sonra herhangi bir resimi , css veya js uzantılı dosyayı templatte nasıl kullanacağımıza yönelik bilgi verilmiştir.
Bu kısımda bir html sayfasındaki html tagları kullanılarak başka bir sayfaya kalıtım alma işlemi ve değiştirilebilir alanların değiştirilmesi konusu ele alınmıştır.
bu kısımda iki temel tag bulunmaktadır . extends ve block tagleri.
{% include 'deneme.html' % } include adından da anlaşılacağı gibi içermek dahil etmek anlamı taşır.
Django template yapısında include tagini bir html sayfasını başka bir html sayfasında kullanmak istediğimiz zamanlar kullanmaktayız.
Bu kısımda javascript ve css kütüphanesi olan bootstrap kütüphanesini sisteme dahil etme işlemini gerçekleştirdik.
Bu kısımda request.GET methodu ile tarayıcı adres çubuğumuzda yazılı olan parametre bilgileri çekme işlemini gerçekleştireceğiz . Bu kısımda formlarda veri alma veri okuma işleminin temeli gerçekleştirilecektir.
Bu kısımda from django import forms sınıfındaki Form Yapısı kalıtım alınarak bir form sınıfı oluşturma işlemi gerçekleştirilmektedir.
Bu kısımda formu views.py dosyasına import ederek ilgili view fonksiyonumuzda kullanma işlemi gerçekleştirilmiştir.
Bu kısımda bir önceki derste kullanılan bootstrap sınıfları hakkında bilgi verilmiştir.
Form yapısını incelemeye devam etmekyetiz.
Bu kısımda htmlden gelen verilerin doğru olup olmadığını kontrol eden is_valid() fonksiyonu ele alınmıştır.
Aynı zamanda eğer formdan gelen değerler doğru ise cleaned_data dediğimiz değişken ile temiz doğru verilere erişme imkanı sağlıyoruz.
Bu kısımda djangoda formlarda sürekli kullanacağımız clean_field methodunu ele aldık.
clean_field methodu html formundan gelen verilerin her alana özel doğruluğunu kontrol etmek için kullandığımız bir methodtur. Eğer clean_field methodu çağrıldıysa geriye mutlaka değer dönderilmelidir.
Bu kısımda clean_field fonkisyonu için bir örnek daha gerçekleştirdik ve aynı zaman da clean method kullanımını ele aldık. Clean method arkadaşlar iki farklı alanın karşılaştırılması gerektiği alanda kullanılabilir bir methodtur.
Aynı zaman da clean methodunda geriye bir değer döndermek zorunda değilsiniz.
Djangoda form elemanlarının görünümlerini değiştirmenin 3 farklı yönetmi bulunmaktadır. Ben bu kısımda sizlerle birlikte çok sık kullandığım 2 yapıyı ele aldım. Widget , form elemanlarının görünümün değiştirmek veya özellik eklemek için kullandığımız yapılardır.
__init__ fonksiyonu bilgindiği gibi pythonda bir sınıfa ait ilk çalışan fonksiyondur. Form elemanlarına özellik eklemenin bir diğer yoluda __init__ fonksiyonlarından geçmektedir.
Bu kısımda djangoda form yapısını oluşturduğumuz modellerle kullanmak için yani modelimize ait bir nesneyi rahatlıkla güncellemek , oluşturmak için modelForm sınıfını ele alacağız . ModelForm , model sınıfımıza ait alanların form elemanı olarak kullanılmasına imkan sağlayan yapıdır. Aynı zamanda modelformun save() methodu sayesinde modele ait bir nesne oluşturma veya güncelleme işlemi gerçekleşmektedir.
Bu kısımda request.POST methodunu kullanarak html formundan gelen verileri backend'teki formumuza aktarma işlemini gerçekleştirdik. POST ve GET iki farklı istekte bulunma yöntemidir. POST ile daha çok gizli veriler yani tarayıcı url adresinde görünmesini istemediğimiz verileri backende göndeririz. Bu kısımda da request.POST'tan gelen dataları aldık.
{% csrf_token %} 3. şahıslar tarafından sistemimize müdahalede bulunulduğu zaman saldırıyı geçersiz kılmak için oluşturulmuş bir sistemdir. Djangoda POST methodunn kullanıldığı her yerde mutlaka csrf_token kullanılmaktadır.
Bu kısımda genel html yapısı ele alınmış olmakta birlikte post-detail sayfası oluşturmak için post-list sayfasında gerekli html ayarlamaları yapılmıştır ve son olarak post_detail view'i ,html sayfası ve url adresi oluşturulmuştur.
Bu kısımda post-list sayfasından post-detail sayfasına yönlendirilme işlemi gerçekleştirilmiştr.
ilk defa sayfalar arasında geçiş yapma işlemi kullanıldı. Django template motorunda bu görevi yerine getiren tag
{% url %} tagidir. Bu tek ile urls.py dosyasında tanımlanan urllerin isimlerini referans alarak tanımlanan url bilgisini getirmektedir. Aynı zamanda tanımlanan adreste parametre aldıysa parametre bilgisi için de parametre almaktadır.
Ayrıca model.objects.get(pk=pk) yapısını kullanarak ORM yapısı kullanılarak var olan bir nesneyi elde etme işlemini gerçekleştirdik. Böylece detay bilgisine sahip olacağımız nesnenin elemanlarını detay sayfasında gösterme işlemini gerçekleştirmiş olduk.
get_object_or_404 fonksiyonu herhangi bir model için get işlemi yaptığımızda sorguya ait bir nesne bulunmadığı zaman object.DoesNotExsist hatası vermek yerine 404 page not found , yani sayfa bulunamadı ekranı ile karşılaştırmak için geliştirilmiş bir fonksiyondur.
Bu kısımda HttpResponseRedirect ve reverse fonksiyonları kullanılarak bir viewdan bir diğer view'a geçiş işlemi gerçekleştirilecektir.
HttpResponseRedirect fonksiyonu girilen url bilgisine göre ilgili view'e istekte bulunma işlemini gerçekleştirmektedir.
reverse fonksiyonu ise nasıl ki templatte {% url 'deneme' % } tag yapısını kullandıysak benzer işlemi gerçekleştiriyor. Yani bir url'nin name bilgisine bakara ilgili adrese gönderme işlemini elle yazmak dinamik bir şekilde gerçekleştiriyor.
get_absolute_url methodu ile nesneye ait detay viewine erişmek için kullanacağımız bir methodudur.
method içinde reverse ve HttpResponseRedirect fonksiyonları kullanılmaktadır.
Bu kısımda oluşturduğumuz nesneye ait güncelleme işlemini gerçekleştireceğiz.
Güncelleme işleminde modelForm yapısı kullanılarak, nesneyi güncelleyeceğiz.
Update işlemi Create etme işleminden farklı olarak model formumuzun instance adındaki parametresini kullanıyoruz.
instance modele ait olan bir nesneyi alarak o nesnenin alanlarındaki içerikleri forma göndermek işlemini gerçekleştirmeye yarıyor ve save ederken instance olarak aldığımız nesneye tekrardan formadan gelen verileri ekliyoruz.
Bu kısımda herhangi bir nesneyi silme işlemi gerçekleştirilmiştir.
Ayrıca django template'de kullanılan linebreaksbr filteri ele alınmıştır. Bu filter ile template'deki icerik bilgimiz daha hoş bir görünüme sahip olup br tagi kullanılması gereken yerlere otomatik olarak br tagi ekleyecektir.
Bu kısımda djangoda yapılan herhangi bir değişiklikte nedir bunlar , silme ,güncelleme,ekleme gibi durumlarda kullanıcıya bilgi vermek için messages framework yapısı kullanılmaktadır.
Bu kısım bir önceki dersin devamı niteliğindedir.
Ayrıca templatede kullanılan {% include % } taginin kullanımını tekrardan ele aldık.
Slug yapısı web sayfalarında herhangi bir gönderinin başlığını tarayıcıda gözükmeisini sağlayan yapılardır.
Bu kısımda unicode hatası almamak için
pip install Unidecode kütüphanesini sisteminize dahil etmelisiniz eğer yükleyemezseniz terminal ekrarnında birde elinizle deneyin.
Bu kısımda hem teorik hem pratik bilgiler ile giriş yapma işlemi gerçekleştirdik . Aynı zamanda asıl işi yapan slugify methodudur.
Bu kısımda arkadaşlar save methodu override edilerek oluşturulacak gönderinin başlık bilgisi alınarak o başlık bilgisinin slugify methodundan alınan çıktısı slugfield alanına aktarılacaktır.
Aynıza zamanda editable adında duyacağınız özellik herhangi bir alanın müdahale edilebilir alan olup olamamasını sağlıyor , editable=True , müdahale edilebilir bir alan olmasını sağlarken editable=False tam tersi işlem gerçekleştiriyor.
Bu kısımda eklediğimiz slugfield alanımızın unique değeri True olduktan sonra eğer var olan bir başlığı başka bir gönderide yazarsak nasıl bir hata alacağımızı ele aldık bir sonraki dersinde de buna nasıl çözüm getirdiğimizi ele aldık.
Bu kısımda get_unique_slug methodu yazarak , eğer daha önce bir nesneye ait olan başlığı eklemeye çalışıyorsam get_unique methodu tarafından veriye müdahale ederek benzersiz bir slug alanı oluşturma işlemi gerçekleştirilecektir.
Eğer başlık bilgisi değişmişse slug alanını güncellemek için işlemler yaptık.
Burada önemli olan bir diğer husus ise nesnenin veritabanından çektikten sonraki hali ve veritabanında değiştirilmemiş halinin karşılaştırılması oldu. Eğer değişen bir başlık bilgisi varsa slug alanıda güncellenecektir.
ManyToMany yapısı ilişkisel veritabanlarından kullanılan bir ilişki yöntemidir. Amaç bir alanda birden fazla bilgi tutmaktır.
Bu kısımda kategori modeli oluşturarak bu modeli blog modelinde manyTomany yapısı ile ilişkilendirdik. Ayrıca Orm yapısını ele alarak bloglarımıza kategori ekleme işlemi gerçekleştirdik.
Bu kısımda kategori modelini , blog eklemek istediğimizde ve bloga ait bir kategori seçmek istediğimizde kategori alanını formda nasıl kullanacağımıza değineceğiz.
Bu kısımda djangoda kullanıcılar tarafından yüklenen dosyalar ile ilgili ayarmalar gerçekleştirilmiştir.
Static dosyaları ekleme yöntemiyle birebir aynıdır.
Bu kısımda blogumuza ait bir kapak fotografı yükleme işlemi gerçekleştirilecektir.
Bunun için blog modelimize imageField alanı eklenecektir.
pip install Pillow komutu ile imageField yapımızı kullanabileceğiz. Terminal ekranında mutlaka eklememiz gerekmetedir.
Bu kısımda post-list ve post-detail sayfasında , kapak fotoğrafına sahip olan gönderilere ait fotoğrafları görüntüle işlemi gerçekleştirilecektir.
Eğer postlarımıza herhangi bir resim yükleme işlemi gerçekleştirilmemişse varsayılan olarak resim atama işlemi gerçekleştirilecektir.
Bu kısımda içerik alanının minimum 100 karakter olma işlemini gerçekleştirdik.
forma ait olan clean_field yapısı kullanılarak gerçekleştirildi.
Bu bölümümüzde djangoda kullanıcı dosyalarını upload ederken , eğer biz herhangi bir müdahalede bulunmazsak dosyaları doğrudan media dizinine yüklüyor direk media dizinine yüklemesini istemediğimiz durumlar için upload_to özelliğini kullanacağız.
Ayrıca upload_to özelliğini kullanırken uuid4 adında bir fonksiyonu her blogumuza ait olan resimi bir klasörün içinde tutması için kullanacağız.
uuid4 fonkisyonu random ve unique sayı oluşturmaya yarayan yapıdır.
upload_to özelliğine yol belirtirken iki farklı yöntem kullanabiliriz.
Bunlardan birisi ilk derste gördüğümüz gibi elle yol vermekti. Bir diğeri ise upload_to özelliğine çağrılabilir fonksiyon yazmaktan geçmektedir.. Bu kısımda upload_to özelliğine bir fonksiyon yazarak fonksiyondan dönen değerin upload_to özelliğine yol olarak geri döndermesini sağladık.
ChoiceField alanlar kullanıcılara seçenek sunup seçeneklerden uygun olan değerlerin bir veya birden fazlasını seçmesini sağlayan yapıdır. Örnek vermek gerekirse cinsiyet ve cinsiyete ait değerler. Oluşturma işleminde aslında pythondaki tuple yapısını kullanmaktayız.
Default Widget yapısı select olarak gelmektedir.
Bu kısımda veritabanına kayıt olarak ekledğimiz choicefield değerini projemizde göstermeye sıra geldi.
ChoiceField yapılar iki kısımdan oluşmaktadır. Bundan bahsetmiştik. Birisi value bir diğeri görünen ismi.
Eğer biz direk choicefield alanı ekrana yazarsak valuesini gösterecektir ama get_field_name_display yapısını kullanırsak value değilde ekranda görünen değeri ekrana yazacaktır.
Bu kısımda form sınıfı kullanılarak , choices yapısı ile birliktefiltereleme işlemi gerçekleştireceğiz ve Blog modelimize ait olan taslak alanına göre seçilen veriyi alıp sorgulama işlemi gerçekleştirilecektir.
Bir önceki dersin devamı olarak gereklı adımlar anlatılmaktadır.
Normal şartlarda modele ait bir sorgulama işlemi gerçekleştirmek istediğimiz durumlarda bir alanı bir kere kullanmakla birlikte , şartlar sadece and (ve) kapısı mantığı ile hareket ediyordu . Yani bir şart sağlanmamışsa direklerine bakmadan queryset boş değer dönderiyordu.
İşte bu noktada djangoda Q objects dediğimiz yapı bize istediğimiz şekilde dilersek veya kapısı dilersek ve kapısı mantığı ile ve istediğimiz kadar aynı alanı kullanarak sorgulama işlemi gerçekleştiriyor dilerseniz biraz teorik bilgiden sonra derste pratiğini inceleyelim
Bu kısımda web sayfamızı tasarımsal olarak güzelleştirmeye gittik ve static dosyalara eklediğimiz bootstrap kütüphanesi ile tasarımı gerçekleştirdik.
Bu kısımda Q object yapısını kullanarak formdan gelen değere göre modelimizin alanlarına bakarak . Eşlesen değerleri post-list sayfasında gösterme işlemini gerçekleştireceğiz.
icontains yapısı modelimizdeki bir alanın içinde ilgili kelimenin geçip geçmediğinin kontrolünü gerçekleştiriyoruz.
Ayrıca başındaki i harfi büyük küçük harf duyarlılığının önüne geçmektedir.
Bu kısımda sayfalama işlemini gerçekleştireceğiz. Sayfalama da amaç sistemin yorulmasını önlemek , Blog modelimizi kullanarak bunu nasıl gerçekleştirdiğimizi ele aldık.
Bu kısımda post-list sayfamızdaki gönderilerimizi sayfalama yöntemi ile listelemeyi ele aldık.
Bir önceki dersin devamı niteliğinde olup template kısmında sayfalama linklerini görüntüleyeceğiz.
Burada arkadaşlar artık sayfalama ve filtreleme işleminin birlikte kullanılmasını ele aldık .
Biz eğer herhangi bir filtreleme işlemi uygulamazsak tüm sayfaların listelenmesini isteriz ama herhangi bir filtreleme işlemi gerçekleştirmişsek filtrelediğimiz verilerin listelenmesini ve sayfalanmasını isteriz.
Bu kısımda bu iki yapıyı ele alarak filtreleme ve sayfalama yapısını beraber kullandık.
Burada bir diğer önemli olan yapı ise bir tarayıcımıza parametre olarak herhangi bir değer girdiğimizde yani
www.ozanteoman.com/?mesaj=merhaba böyle birşey yazdığımızd bu veriye templatte erişmek istersek request.GET.mesaj diyerek mesajın değerini alabilirz. Bizde sayfalama yaparken buna benzer işlemler gerçekleştireceğiz.
Açık kaynak kodlu ücretsiz zenginleştirilmiş metin içerik editörüdür. Ne için kullanmamız gerek diyecek olursak bir gönderi oluşturmak istediğimiz zamanlarda yazılan yazının göze daha hoş gelmesine imkan sağlıyor. Blog sitelerinin olmazsa olmazlarından biridir.
Django 1.10 için ckeditor kurulumunda yapılması gereken terminal ekranına
pip install django-ckeditor == 5.5.0
bu ve diğer adımlar derste detaylı bir şekilde anlatılmıştır.
Birinci dersin devamı olarak blog eklerken ckeditor yapısını kullanmak istediğimizde ne yapmamız gerek gibi konuları ele aldık.
ForeingKey (Yabancı Anahtar ) bire çok mantığıyla hareket eden ilişkisel veritabanı yapısıdır.
herhangi bir tablodaki verinin diğer tabloda birden çok tekrar edip hareket kazanmasıdır. Bu kısımda temel mantığı ele alınmıştır.
Bu kısımda foreingKey yapısı kullanılarak yorum sistemini oluşturmayı ele aldık . Yorum sistemimizin mantığı şu şekilde ilerliyor . Blog modelimizi Comment Modeline ForeingKey olarak atadık. Aslında bu durumda şunu düşünebiliriz. Bir gönderinin altında birden fazla yorum yapılabilir.
Bu kısımda amaç blog modelimizi comment modelimize foreingkeyli alan olarak tanıttıktan sonra bu ikiliyi beraber nasıl kullanacağımızı bilmek bu videoda bunu gerçekleştirdik.
Bu kısımda bir önceki derste orm yapısı ile comment modeline eklediğimiz her bir blog modelimize ait , yani herhangi bir gönderiye ait yorumları , ilgili gönderimizin altında listeleme işlemini gerçekleştirdik.
Bu kısımda yorum yapmak için gerekli olan alt yapıyı hazırladık .
Nedir Bunlar add-comment view'in yazılması , Addcomment formunun oluşturulması
Bu video ile yorum yapma sisteminin sonuna geldik . Formdan gelen verileri comment modeline aktararak bir yorum yapma işlemi gerçekleştirmiş olduk. Basit temel seviye yorum yapma işlemi bu şekilde :)
Djangoda user (kullanıcılar ) ile işlem yapmaya sıra geldi . Djangoda kullanıcı oluşturmak için hali hazırda gelen mevcut bir model vardır . Bizde bu modeli kullanarak çeşitli user'e ait işlemleri ele alacağız.
Merhabalar bu kısımda register olma işlemini gerçekleştireceğiz.
Arkadaşlar burada sizinle birlikte userlar ile ilgili işlemler yapmak için app oluşturacağız.
Ben oluşturduğum app'in ismine auths dedim daha önceden djangoda böyle bir isimde app olduğu için sıkıntıya uğradım
Siz app oluştururken users derseniz benim videoda aldığm hataları almazsınız.
python manage.py startapp users
Bu kısımda kayıt olma işlemi gerçekleşirken aynı zaman da bazı değerleri kontrol etmemiz gerecektir. Nedir bunlar ?
Eğer iki tane password ve password_confirm alanı oluşturduysak iki şifreninde aynı değerler olması gerek eğer aynı değilse uyarı vermemiz gerecektir.
Email adresini sisteme kayıt ederken eğer daha önceden sistemde kayıtlı olan bir maili giriyorsa , uyarı verdirmemiz gerek.
Bu bölümde de form alanlarının verilerini doğrulamaya devam ediyoruz .
Bu kısımda artık bir user kayıtı oluşturuyoruz aslında biz kullanıcı oluştururkende veritabanına bir kayıt ekleme işlemi gerçekleştirmiş oluyoruz. Daha sonra bu kayıt ettiğimiz kullanıcıyı login işlemine tabi tutuyoruz.
Hem bu kısımda registerden sonra hemen login olma işlemini ele aldık hemde bir sonraki derste login olma işlemini ele alacağız.
Bu kısımda authenticate adında bir fonksiyon import edeceğiz bu fonksiyon username ve password bilgisi girilen kullanıcının sistem kayıtlı bir kullanıcı olup olmadığını test ediyor. Eğer böyle bir kullancıı varsa login fonksiyonu ile login oluyoruz
Bu kısımda form oluşturarak username ve password bilgisi kullanılarak login olma işlemini gerçekleştireceğiz.
Birinci dersin devamı olarak login olduktan sonra gerekli ayarlamaları ele aldık.
Bu bölümde usrname yerine email adresi kullanarak login olma işlemi gerçekleştireceğiz. Fakat göreceğiz ki arkplanda yine username ile yetkilendirme kontrolu yapıyoruz :)
Bu kısımda ise login olup sisteme giriş yapan bir kullanıcıyı logout ile sistemden çıkış yapma işlemini ele aldık.
is_authenticated fonksiyonu eğer istekte bulunan kullanıcı login olmuş bir kullancıı ise True değeri dönderen bir özellik, eğer login olmamış bir kullanıcı ise False değerini dönderen özelliktir. is_anonymous ise tam tersi işlemi yerine getirmektedir.
Arkadaşlar öncelikle decoratorsler hakkında bilginiz varsa bu videoyu izlemek zorunda değilsiniz . Daha önce duymayan arkadaşlar temel bilgi vermek amaçlı teorik bilgi bahsedilmiştir.
Decorators dediğimiz yapılar fonksiyon içinde fonksiyon tanımlama ve parametre olarak fonksiyon alıp o fonkisyonu içinde tanımlanan fonksiyon da çalıştırma işlemidir. Bazı durumlarda fonksiyonlarımız bir durumu kontrol edebiliyorlardır . Bunlara ek olarak ikinci durum veya ek kontrol getirmemiz gerektiği zamanlarda decoratorlere ihtiyaç duyarız.
Mesala şöyle düşünelim bir fonkisyonumuz var sadece ekrana mesaj yazıyor . Ayrıca bir decoratorumuz olsun bu decorator ise ekrana mesaj veren fonksiyonun yazısının kalın olmasını gerçekleştiriyor. Bu gibi görev en basit hali biz ise viewlarımızda daha çok kullanacağız . Kullanıcı login olmamışsa farklı bir işlem yapsın login olmuşsa farklı işlemler gerçekleştirsin gibi ayarlamalarda kullanacağız.
LoginRequired decoratoru adından da varsayım yapılacağız gibi herhangi bir veriye erişmek için sisteme login olup olmadığını kontrol etme işlemi eğer login olmuşsa veriye erişiyor . Eğer olmamışsa ise login sayfasına yönlendirme işlemini gerçekleştiriyoruz.
login_requeired'da çoğunlukla iki parametre kullanılır bunlardan birisi redirect_field_name bir diğeri ise login_url
rediredit_field_name videoda bahsedemedim benimde pek kullanmaya ihtiyaç duymadığım bir yapıydı.
Şöyle ki biz herhangi bir sayfaya istekte bulunmak istedik fakat login olmamışsak decorator devreye giriyor ve login_url adresine ne yazılmışsa ilgili login ekrarına gidiyor ve daha sonra istekte bulunduğu sayfanın url bilgisini next adında bir paramterede tutuyor. Eğer login başarılı olmuşsa istekte bulunduğu sayfaya geri yönlendiriliyoruz.
Bu kısımda arkadaşlar amacımız eğer bir kullanıcı sisteme login olmuşsa ve tekrardan login sayfasına gitmeye çalışıyorsa ya da login olduktan sonra register sayfasına yönlenmek istiyorsa da bu gibi durumların önüne geçmektedi. İki farklı şekilde bu kullanımını ele aldık önce kolay sonra daha profesyonel bir teknikle decorator yazarak
eğer login ve register sayfasına erşmek istiyorsa anonymous user olmasının gerektiğini belirttiğimiz bir sistem oluşturduk.
İlişkisel veritabanı mantığından belkide en basiti olan bire bir ilişkiyi ele almaya sıra geldi.
One To One Field mantğı arkadaşlar bir tablodaki veri ilişki olarak aldığın diğer tabloda sadece 1 kere tekrar etmesi gerektiği durumlarda kullanılabilir mesala bunlar nedir ? user ve userprofile kullanıcı bilgileri ve profil bilgisi gibi bilgiler bir kullanıcının sadece bir tane profili olabilir bu gibi durumda bu yönteme gidebiliriz.
Bir modeli başka bir modelde one to one ilişki ile bağladığımızda bağlanan ilişki alan model sanki ilişki alınan modelin bir alanı gibi davranır . Neden diyecek olursakta one to one olduğu için sadece bir tane olan bulunacaktır. ForeingKey veya ManyToMany gibi değil . O yüzden bence en kolay anlaşılan yapı budur.
Bu kısımda one to one field yapısına örnek olsun diye oluşturacağımız userprofile modelini user ile ilişkilendirip bir one to one ilişki gerçekleştireceğiz.
Bu kısımda ise orm yapısı ile one to one field yapısına örnek vereceğiz.
Bu bölümde arkadaşlar kullanıcılara profil sayfası oluşturma işleminden önceki adımları gerçekleştirmekteyiz.
Kullanıcının bu ve bundan sonraki eğitimler sonunda basit seviyede profil sayfası olacaktır.
Temel seviyede profil sayfası oluşturduk bu dersimizde.
Bu kısımda profil sayfamızda kullanıcının profil fotoğrafını veya default bir fotoğraf görme işlemi için bir fonksiyon yazdık. Nasıl ki facebookta registerden sonra login olduğumuzda boş bir fotoğraf geliyor böyle bir işlem gerçekleştirdik.
Tasarımın en son hali ektedir arkadaşlar ama siz yinede videoy'u takipte kalın.
Bu kısımda arkadaşlar kullanıcının verilerini güncelleme işlemine başlamış olduk . Nedir bunlar mesala ?
Profil resmi değiştirme , email adresi değiştirme ,isim soyisim gibi bilgileri değiştirme.
Dersin devamı olarak update formumuzu ekranda görüntüleme işlemini ele aldık.
Bu kısım arkadaşlar şu yönden çok önemli formun inital adını verdiğimiz başlangıç özelliğine profile modeline ait olan fieldlerin başlangıç değerleini veriyoruz. Model formlarda sadece bir tane model referans alınabilir işte bu yüzdendir ki initail değerini kullandık . Daha sonra formdan gelen veriler ile birlikte profile modeline ait alanları form.cleaned yapısı ile çektikten sonra profile bilgilerini güncelledik.
Bu kısımda ise arkadaşlar doğrulama işlemlerine devam ettik . Kullanıcı email bilgisi değiştirmek istediği zaman ki durumu ele aldık. Ayrıca diğer yapılarıda inceledik.
Bu kısımda kullanıcının hakkımda alanını kullanarak hakkımda sayfasında kullanıcıya ait bilgileri görüntüleme işlemini ele aldık.
Bu kısımda kullanıcının şifresini değiştirme işlemini ele aldık. Şifre değiştirme 2 aşama da gerçekleştirelecek.
İlk olarak kendimiz form oluşturarak şifre değiştirme işlemini ele alacağız .
Bir diğeri ise django.contrib.auth.form import passwordChange yapısını kullanarak ele alacağız
Amacım önce şifre değiştirme işleminin mantığını anlatmak daha sonra kısa halini göstermek
Bu bölümde şifre girilirken ki kontrol ve veri doğrulama işlemlerini ele aldık.
Burada mevcut şifrenin girilmeisini istendi eğer yanlışsa uyarı alma işlemini gerçekleştirdik.
Ayrıca yeni şifre girerken birde yanında doğrulama işlemi için ikinci bir yeni şifre giriş alanı oluşturduk ve doğrulamasını gerçekleştirdik.
Parola değiştirme işlemi hala devam ediyor bu kısımda.
Parola değiştirme işleminde oluşturduğumuz formu kullanarak şifre değiştirme işleminin son videosudur.
Sıra geldi kullanıcılara blog yazısı yazdırmaya bu kısımda , blog modelimize foreingkey olarak user modeli atayarak
kullanıcıların attığı postları takip etme işlemini gerçekleştirdik.
Bu ders bir önceki dersin devamı niteliğinde olmakla birlikte postları sıralama işlemi için ele aldığımız iki yöntemi inceledik.
Bunlardan birisi
class Meta:
ordering = ['alan_isim']
burada orderin yapısı ile bir sıralama işleminin şartını belirliyoruz , hangi alanı veya alanları referans alarak sıralama yapacaığımızı belirliyoruz. Hangi alan ismini önce yazarsak ilk olarak onu referans alıyor.
Aynı şekilde bir sorgulama işlemi gerçekleştiriken models.objects.all().order_by('alan','alan1') şekilde sıralama gerçekleşebilir.
Kullanıcılar kendi profiline girdiğinde veya başkasının profiline girdiğinde farklı sekmeler veya linkler görebilir.
Örneğin kullanıcı kendi profiliinde şifre değiştir linkini ziyaret edebilirken , başkasının profilinde şifre değiştir linkini ziyaret edemez bu bölümde temel kıstılama işlemlerini ele aldık.
Bu bölümde kullanıcıların kendilerine ait olan gönderilerini profil sayfalarında listeleme işlemini ele aldık.
Bundan önce template extend yapısını kullanarak base_user_profile.html sayfasını kalıtım aldık ve default profil sayfası olarak gönderileri userprofile olarak kabul ettik.
ForeingKey olarak User modelimizi Blog modelimiz ile ilişkilendirmiştik . İlişkilendirme yaptığımız durumlarda herhangi bir modeli başka bir modelde kullandığımız zaman , ForeginKey'li alanın tekrar eden satırlarını almak için user.blog_set.all() dediğimiz zaman kullanıcının blog sayfasında tekrar eden satırlarını çekiyoruz.
Bu kısımda daha detaylı bir şekilde user ve blog model ilişkisinin kullanımını ele aldık , related_name yapısının ne olduğunu ve nereden geldiğini inceledik.
Ziyaret ettiğimiz profil eğer bizim profilimiz değilse , ziyaret ettiğimiz kullanıcıya ait olan gönderileri silme işlemini veya güncelleme işlemini gerçekleştiremeyiz. Bu bölümde kullanıcı kısıtlamalarını ele aldık.
Kullanıcı profilinde hangi linke tıklanmışsa o linke ait olan buttonun aktif olma işlemini gerçekleştirdik.
Diğer bölümlerde nasıl ki kullanıcı ile blog modelini ilişkilendirdiysek bu bölümde de user ile comment modelini ilişkilendirme işlemini ele aldık.
Yorum sistemlerinde genellikle kullanıcılar yorum yapmadan önce yorum yapacağı ekranda profil resimleride görünürler . Bu bölümde biraz tasarım biraz django template moturunda yararlanılarak.
Yorum sistemizi düzenleme yoluna gittik. User model ile foreingkey'lediğimiz için bir önceki yorum sistemizdeki email , firstname , lastname gibi model alanlarını kaldırarak doğrudan user model üzerinden kullanıcınnın bilgilerini çekme yoluna gittik.
Signaller herhangi bir olay gerçekleştikten sonra farklı bir olayın gerçekleşmesini sağlayan yapılardır. Yani bizim amacımızda bu kısımda herhangi bir modele ait olan fonksiyonu çalıştırdıktan sonra farklı bir fonksiyonun çalışma işlemini gerçekleştireceğiz.
Amacımız bir kullanıcı oluştururken kullanıcının profil modeline ait olan bir nesne oluşturmak olacaktır.
Yani şöyleki veritabanına bir kullanıcı ilk defa ekleniyorsa .save() ediliyorsa yani . Aynı zaman da kullanıcının profilinide veritabanına aktaracağız.
.glyphicon-star { color: #CCCCCC; font-size: 16px;}
.glyphicon-star.active { color: #FDB230;}
Favorilere ekleme işlemi için kullanacağımız .css yapısı.
Amacımız kullanıcının hoşuna giden gönderiyi favorilere ekle işlemini gerçekleştirmek. Bu kısımda bunun için BalogFavori adında model oluşturacağız ve alan olarak user ve blog alanlarını foreingKey olarak kullanacağız.
Burada amaç şu yönde bir kullanıcı birden fazla gönderiyi favorilere ekleyebilir.
Favorilere ekleme çıkarma işlemi için gerekli olan view ve url yapısını oluşturduk.
Eğer kullanıcı favorilere ekleme işlemi gerçekleştirmişse veritabanına ekleme işlemi yapmış oluyor.
Eğer eklenen favoriyi çıkarma işlemine giderse delete etme işlemi gerçekleştirmiş oluyor.
Bu dersimizde yukarıda bahsedilen söz adımlarını uygulamayı amaçladık.
Bir problemi çözmenin birden fazla yolu olabilir. Django da register_filter dediğimiz sistemler ile bir fonksiyona parametre gönderebiliyoruz.
Kullanıcının bir gönderiyi favorilere ekleyip eklemediğinin kontrolunu register_filter yönteminden farklı bir yöntemle aldık.
Algoritmik adım şuydu. Öncelikle bize bu gönderiyi favorilere ekleyen kullanıcıların username bilgilerini getir emrini verdik. Tabi bunu getrmek için de şu yapıyı kullandık values_list . Bu yapı şu işlemi gerçekleştiriyor.
Eğer bir modele ait bir satır veriyi değilde tablonun satırının sadece ilgili alan veya alanlara ait olan değerleri getirmek istediğimiz zaman values_list özelliği çağrılır.
Bu bölümde kullanıcın doğum tarihi bilgisini veri tabanına ekleme işlemini ele aldık.
Dersin sonlarına doğru geldiğimizde göreceğiz ki html tarafından eklenen form bizim için pek ideal bir kullanıma sahip olmuyor. Bunun için çözümler üreteceğiz. Aynı zaman da bir diğer konu ise tarih formatı
input_formats ve format adında form alanımızın iki özelliği mevcut olacaktır. Bunların ilki tarih format girişi diğeri ise doğum tarihinin görünüşü olacaktır.
Bootstrap kullanılarak geliştirilen datetimepicker elemanını kullanımını ele aldık.
Bu bölümde gönderiye yapılan yorum sayısını ve favorilere ekleme sayısının alt yapısını oluşturmayı ele aldık.
Yeni bir bölüm ile merhaba arkadaşlar . Bu bölümde takipleşme sisteminin zeminini hazırlamak adına javascript ve jquery temel yapısını ele aldık.
Jquery'nin temel yapısını ve button click eventini bize lazım olan yapıları bu bölümde ele aldım arkadaşlar umarım faydalı olmuştur.
Bu derste diğer dersi devamı niteliğinde arkadaşlar . Takipleşme sistemine zemin hazırlıyoruz.
Bu videoda ajax hakkında teorik bilgi verilmiştir.
Bu bölümde basit bir şekilde ilk ajax requestimizi herhangi bir view'a gerçekleştireceğiz.
Ajax isteği işlemleri devam ediyor
Bu bölümde form'un submit eventini ezerek kendi yazdığımız ajax isteğiyle birlikte formu submit edeceğiz.
Bu bölümde takipleşme sistemine geçmeden gerekli olacak son yapıyı ele aldım , render_to_string fonksiyonu bence çok güzel bir fonksiyon olup html uzantılı template yapısını işleyip bize string olarak geriye değer dönderiyor ve böylece bu değeri herhangi bir yerde ekranda gösterebiliyor ve kullanabiliyoruz.
Takipleşme modeli ve ilişkilendirilmesi ele alınarak takipleşme sistemine başlamış bulunmaktayız.
Bu bölümde bir önceki derste takipçiler sayısı ve takip edilenler sayısını sadece profil sayfasında görebiliyorduk ;fakat hakkımda , şifre değiştir sayfalarında göremiyorduk. Bunun önüne geçmek için diğer sayfalarada gerekli kod dizinlerini yazdık
Bu kısımda kullanıcıların takip edilenlerini ve takipçilerini listelemek için gerekli adımların temeli atılmıştır.
Gerekli front-end ve backend'e istekte bulunacağımız view fonksiyonumuz yazıldı.
Modelde ilgili querysetleri çekmek için classmethodlar yazılmıştır.
Bir önceki dersin devamı olarak devam etmedektedir.
Takipçiler ve takip edilenleri render_to_string fonksiyonu kullanılarak listeleme işlemi gerçekleşti.
Merhabalar bu derste takipleşme sisteminde takipçiler ve takip edilenleri listelerken , kullanıcıları takip edip , etmeme durumuna göre takip et , takipten çıkar buttonu göster işlemiin gerçekleştirmek için custom filterlara ihtiyaç duyduk.
Djangoda sık kullanılan bir yapıdır .
Bu bölümde bir önceki derste teoriği verilen custom filter tag yapısının uygulaması ele alınmıştır.
Bu derste arkadaşlar takip edilen ve takipçiler buttonun ajax ve backend işlemlerini ele aldık uzun bir ders konusu oldu.
Bu derste kullanıcı kendi profilinde , kendini takip eden kullanıcıları listelediğinde takipten çıkar & takip et buttonuna tıkladığında gelen dönen değerde problem oluyordu. Bu problemi çözme işlemi gerçekleştirildi.
Bu derste ajax ile takip edilenler ve takipçiler verilerini açılan modalda sayfalama işleminin temelleri atılmıştır.
Ajax ile herhangi bir gönderiyi favorilerine ekleyen kullanıcılarını , modal üzerinde listeleme işlemini ele aldık.
Django , Python'ın açık kaynak kodlu web framework'üdür. Neden Django öğrenmeliyiz sorusuna hızlıdır ve güvenilir cevabı hali hazırda verilebilir ama tek bunlar yetmiyor.
Django öğrenmeye başlayınca görüyoruz ki hali hazırda bir ORM yapısı bizi bekliyor. Nedir bu ORM yapısı diyecek olursak da, temel olarak programlama dilinin kodlarını kullanarak SQL sorgusu yazmadan sorgulama işlemi adını verebiliriz. Aynı zamanda veritabanı işlemleriyle sizi boğmadan çok rahat bir şekilde tablo oluşturarak hızlı bir şekilde ürününüzü geliştirme imkanı sağlıyor.
Bu eğitimde Django'da olmazsa olmaz olan: Form sınıfları , model sınıfları , kullanıcıları ve modeller gibi temel konuları detaya ineceğiz. Her bir konuyu detaylı anlatımla ele alarak güncel web sitelerindeki benzer örnekleri referans alarak öğreneceğimiz , öğrenirken eğleneceğiniz bir eğitim olacak.
Anlamadığınız yerlerde sorularınıza 7/24 cevap veriyor olacağım! Sizlerden gelen talepler doğrultusunda derslerin içerikleri güncellenebilir olacak ve ders ekleme durumunu gerekirse güncellemeler yapacağım.
Ben eğitim bu serisini hazırlarken çok eğlendim , umarım sizler de izlerken eğlenir ve öğrenirsiniz. :)