PYTHON-DJANGO-BLOG PROJE ÇALIŞMASI 5 (Uygulamamızda veritabanı işlemleri-database and migrate)

Projemiz veritabanı bağlantılı bir proje. Dolayısıyla database ile projemiz arasındaki bir iletişim olması gerekir. Veritabanına bazı bilgiler kaydetmek isteyebilir bazen de database den bilgi almamız gerekebilir. Bu gibi durumunlar için önceden ADO.NET(projelerde veritabanı ile ilgili yapılan işlemlerde yazılımcı doğrudan sql sorguları yazmak durumundadır) teknolojisi kullanılmaktaydı. Biz bu çalışmada bu işi django framework ün (Object Relationel Map) ORM özelliği sayesinden daha kolay yapacağız.
ORM: Database içerisinde yer alan tablolar bir sınıf (class), kolonda başlıkları her biri özellik(property) olarak tanımlanmakta, veritabanındaki kayıtlara da ait olduğu sınıfta bir obje olarak erişebilmekte ve kullanabilmekteyiz.
Temel olarak database yapısından bahsettikten sonra şimdi blog app mizden django da database yapısını kullanmaya çalışalım.
Aşağıdaki adımları izleyin:

1.  blog app uygulamamızın altındaki models.py dosyasını açın. 

Djangonun models yapısından kalıtım(inherit) yoluyla modelimizi geliştireceğiz. Django model yapısından kalıtım yoluyla örnek bir Bir Post etme işini yapan bir model geliştirelim. 
Aşağıdaki kod models.py içinde otomatik tanımlanmış gelir. 
from django.db import models

Modelimizi sınıf yoluyla oluşturuyoruz. O zaman models.py içine Post isimli bir class tanımıyla başlayalım. Bu Post umuz hangi öznitelikleri barındıracak. Ona göre post isimli classımızın özniteliklerini(başlık, içerik, yazar, tarih gibi) de belirlemek gerekir. Şimdi bunun ilgili kodları ekleyelim.

models.py de son durum:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


# Create your models here.
class Post(models.Model):
title = models.CharField(max_length=100)
context = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)

Yazar silindiğinde ona ait databese deki diğer tablo bilgileri de silinsin diyebilmek için.  foreing key’i oluştururken sonuna ON DELETE CASCADE , primary tablodaki kaydı sildiğinizde foreign key’in tanımlı olduğu alt tablodaki kayıtları’da otomatik olarak silinmesi sağlandı.

2. Sıradaki işlem yazdığımız modelin veritabanına gönderilmesi gerekli tablo ve lanların ayarı için  makemigrations-migrate ikilisini yapmaya geldi. Başka bir deyişle database e yaptığımız değişiklikleri bildirmemiz gerekiyor. 
Terminalden Command satırını açın ve aşağıdaki komutları sırayla uygulayın:

>>>py manage.py makemigrations yazıp Enter a basın.(1)

( Yukarıdaki işlem bir sonucu Terminalde şöyle bilgi gelecektir :
Migrations for 'blog':
  blog\migrations\0001_initial.py
    - Create model Post

0001_initial.py bu bizim sql komutunu barındırır. Bu işlemi makemigrations komutu  ile django bizim için otomatik yaptı. 0001_initial.py içeriğindeki sql kodları görmek isterseniz aşağıdaki komutu command liner a giriniz.

>>>py manage.py sqlmigrate blog 0001 yazıp Enter a basınız. (sql sorgu kodunu incelyebilirsiniz.)

3. models.py dosyamızın içine dunder( double underscore) kullanarak aşağıdaki class tanımımızda geçen title değerini döndürmek istiyoruz. ( dunder metod)

not: dunder metod pythonda özel tanımlıdır bir görevi olan metodlardır. örneğin burada kullanılan dunder metod _ _str_ _  dir ve _ _str_ _   fonksiyonuna sınıfınızın vereceği cevabu kullanacağız. 

aşağıdaki kodlara göre dunder metodumuz aşağıdaki class tan title değerini alabilecektir.

_ _str _ _ Dunder fonksiyonu:
    def __str__(self):
return self.title

 models.py ye dunder metodu ekledik ve son durum:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


# Create your models here.
class Post(models.Model):
title = models.CharField(max_length=100)
context = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)

def __str__(self):
return self.title

4.  blog app içindeki views.py dosyasına geçelim.

Bu dosya içerisine üst kısma aşağıdaki kodu ekleyelim. (Az önceki adımda inheritle oluşturduğumuz Post isimli classımızı .models den views a  import etmiş olduk.)

from .models import Post
5. views.py içinde bir değişiklik daha yapmamız gerekir. Önceki bölümlerde posts isimli viewsmızı sadece anasayfada birşeyler görünsün diye deneme amaçlı sayfalarımızda bir içerik(context sözlük tipindel listeyi  içerik ayarlamıştık) göstermemizi sağlamıştı. Artık sayfamızda veritabanından bilgi çağırarak (Post.objects.all() komutu ile) içerik göstereceğimize göre views.py içindeki posts isimli sözlüğü listesini kaldırabiliriz.

    views.py dosyasında olan aşağıdaki kısmı silebilirsiniz:

posts = [
{
'author': 'Cemal Süreya',
'title': 'Blog Post 1',
'content': 'İlk post içeriği',
'date_posted': '30 Ağustos 2021'
}
,
{
'author': 'Ahmet Muhip Dıranas',
'title': 'Blog Post 2',
'content': 'ikinci post içeriği',
'date_posted': '10 Eylül 2021'
}

]


Bu adımda artık ana sayfamızda( ya da istediğiniz bir sayfada) veri tabanında yer alan bir içeriği göstermek istiyoruz. 

Bunun için aşağıdaki değişikliği yapmamız gerekir.

def home(request):
context = {
'postsA':Post.objects.all() # (posts isimli içeriği az önce silmiştik almak yerine #çünkü burada veritabanından çağırma işlemi yapıldı=Post.objects.all() komutu ile)

}
return render(request, 'blog/home.html', context)

Yukarıdaki değişiklik ile database(veritabanı) den veri çekme işlemi yapılmış oldu.  Konsolda aşağıdaki komutu yazıp ENTER a basın çalışmanızı test edin.

>>>py manage.py runserver  Enter a basılır.


Web tarayıcımız açıldığında veritabında kayıtlı bir bilgi olmadığı için içeriğimiz boş geldi ancak birazdan POST isimli classımızın bulunduğu veritanına birşeyler yazıp POST bilgileri girilmesi gösterilecek ve sayfamızda POST un içinde yer alan içerik görünmeye başlayacak.

NOT: Sonraki adıma geçmeden önce home.html e girip gösterilecek POST içeriğindeki ile ilgili tarih saat ayarını yapalım. 
Aşağıdaki kodda tarih saat ayarında geçen  F, Aralık gibi açık şekilde ay'ın  adını yazarken, d ise günü, Y ise yılı açık şekilde göstermeyi sağlar.

<div>
<a class="mr-2" href="#" >{{ post.author }}</a>
<small class="text-muted">{{ post.date_posted|date"F d, Y" }}</small>
</div>

home.html dosyamızda yukarıdaki ayarla ile birlikte ufak bir tasarım ayarı yapıldı. home.html nin son hali aşağıdaki gibidir.

home.html son şimdilik son şekli:


{% extends 'blog/base.html' %}
{% block content %}
{% for post in postsA %}
<div class="container">
<div class="card bg-dark text-light">
<div class="card-header">
<div>
<a class="mr-2" href="#" >{{ post.author }}</a>
<small class="text-muted">{{ post.date_posted|date"F d, Y" }}</small>
</div>
<h1><a class="card-title" href="#" >{{ post.title }}</a>media-body</h1>
<p class="card-body"> {{ post.content }} </p>
<p>{{ post.content }}</p>
</div>
</div>
</div>
{% endfor %}
{% endblock %}


6. Şimdi sıra geldi admin page e girdiğimizde orada groups ve users ayaları vardı. Şimdi admin page de Post isimli modelimizi(class) orada göstermeye sıra geldi. 

Bu işlem için aşağıdaki adımları takip edelim:

a. blog app altındaki admin.py dosyasını açılır.

Oluşturduğumuz modelleri admin page de görmek istiyorsak bu admin.py içine kaydedilmesi(register) yani tanımlama işlemi yapılması gerekir. Bu işlem için
 
blog app altındaki admin.py içine aşağıdaki kodu eklemek gerekir:

from django.contrib import admin
from .models import Post


# Register your models here.
admin.site.register(Post)







































Yorum Gönder

0 Yorumlar