Django İlk Uygulamamızı Yazıyoruz – 2

Yönetim panelini etkinleştirmiştik. Şimdi küçük bir mikroblog uygulaması yapalım. Bu uygulamada eğer “The Social Network” filmini izlediyseniz, Mark’ın mikroblogu gibi bir şey yapacağız. Twitter’a benzer olan bu mikroblogda yapacağımız şey belli bir karakter limiti ile yazılar yazmak ve onları SEF Url’ler ile göstermek olacak. Şimdi projemizin dizinine geliyoruz. manage.py dosyasını görmeniz lazım. Öncelikle bir adet uygulama oluşturmamız gerek. Uygulama ve projeler arasındaki farka bakarsak uygulama projenin içinde olur ve bir işlem yapar, örneğin bloglar gibi. Ama proje bu uygulamaların bütünüdür. Mesela büyük bir teknoloji sitesi açtınız. Projenize forum ve blog da eklemek istiyorsunuz. İşte asıl site, forum ve blog bu projeye dahildir ama bu uygulamalar birer proje değildir.

Hemen şu komutu çalıştırarak bir adet uygulama oluşturalım:

python manage.py startapp mikroblog

Bu komuttan sonra projenizin dizininde “mikroblog” adında bir klasör oluşacaktır. Bu klasörün içeriğinde şu dosyaları görmeniz gerekiyor.

  • __init__.py
  • models.py
  • views.py
  • tests.py

Bu dosyaları gördüyseniz projenizi başarıyla oluşturdunuz. Şimdi models.py dosyasına girip aşağıdaki kodları yazın.

#-*- coding:utf-8 -*-
from django.db import models

# Create your models here.

from django.contrib.auth.models import User
from django.template.defaultfilters import slugify

class MikroManager(models.Manager):
    def live(self):
        return self.model.objects.filter(yayinlanmis=True)

class Mikro(models.Model):
    yayinlanma_tarihi = models.DateTimeField(auto_now_add=True, editable=False)
    guncelleme_tarihi = models.DateTimeField(auto_now=True, editable=False)
    baslik = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255, blank=True, default='')
    icerik = models.TextField()

    yayinlanmis = models.BooleanField(default=True)
    yazar = models.ForeignKey(User, related_name='yazilar')
    objects = MikroManager()

    class Meta:
        ordering = ['-yayinlanma_tarihi','baslik'] # en yeniler her zaman üstte olacak

    def __unicode__(self):
        return self.baslik

    def save(self, *args, **kwargs):
        if not self.slug: #slug yoksa başlığı sluga çevirerek kullan
            self.slug = slugify(self.baslik)
        super(Mikro, self).save(*args, **kwargs)

    @models.permalink
    def get_absolute_url(self):
        return ('mikro:detail',(),{'slug':self.slug})

Modelimizi oluşturduk şimdi projemizin ana dosyasına girelim yani ilkProjem dizinine. INSTALLED_APPS değişkenine değer eklememiz gerekiyor. Şu şekilde yapmanız gerekiyor.

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    'django.contrib.admindocs',
    'mikroblog',
)

Bunu yaptıktan sonra manage.py dosyasını çalıştıracağız. Şu komutla tekrar çalıştırın.

python manage.py sql mikroblog

Komut satırında şöyle bir SQL komutu gördüyseniz uygulama kurulmuş demektir:

BEGIN;
CREATE TABLE `mikroblog_mikro` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `yayinlanma_tarihi` datetime NOT NULL,
    `guncelleme_tarihi` datetime NOT NULL,
    `baslik` varchar(255) NOT NULL,
    `slug` varchar(255) NOT NULL,
    `icerik` longtext NOT NULL,
    `yayinlanmis` bool NOT NULL,
    `yazar_id` integer NOT NULL
)
;
ALTER TABLE `mikroblog_mikro` ADD CONSTRAINT `yazar_id_refs_id_2c2ad8b2` FOREIGN
 KEY (`yazar_id`) REFERENCES `auth_user` (`id`);

COMMIT;

Son bir kere daha syncdb komutunu çalıştırıyoruz.

python manage.py syncdb

Şimdi biraz oynayalım. “manage.py” dosyasını gene çalıştırıp interaktif kabuğa gireceğiz.

python manage.py shell

Aşağıdakileri teker teker girin.

Python 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from mikroblog.models import Mikro
>>> from django.utils import timezone
>>> from django.contrib.auth.models import User
>>> yazar = User.objects.get(id=1)
>>> yazi = u'Şu an bunu okuyorsanız başarıyla kurdunuz demektir :) '
>>> tarih = timezone.now()
>>> baslik = u'Düşünme, yap!'
>>> n = Mikro(yayinlanma_tarihi=tarih, baslik=baslik, icerik=yazi, yayinlanmis=T
rue, yazar=yazar)
>>> n.save()
>>> Mikro.objects.all()
[<Mikro: D├╝┼ş├╝nme, yap!>]
>>> Mikro.objects.get(pk=1)
<Mikro: D├╝┼ş├╝nme, yap!>

Şimdi bir adet yazı oluşturmuş durumdayız. Veritabanımıza baktığımızda konsoldaki gibi Türkçe karakter problemi olmadan kayıt edildiğini görebiliriz.

Template Sistemi ve Yazıyı Gösterme

Gene projemizin settings.py dosyasını (ilkProjem/settings.py) açıp bir değişkeni daha düzenleyeceğiz. Bu değişken template dosyalarının barındığı klasör ismini depo ediyor. Şöyle değiştirin:

import os
import os.path
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]

Ardından aynı dizin içerisine bir “templates” dizini oluşturun. Onun içine de “mikroblog” dizini açın. Ardından article.html diye bir dosya oluşturun. Şimdilik bu işimiz bitti.

urls.py dosyası oluşturun

Bir urls.py dosyası oluşturun ama “mikroblog” dizini içerisinde olsun. O dosyayı açın ve şöyle düzenleyin.

from django.conf.urls import patterns, url
from . import views

urlpatterns = patterns('',
    url(r'^$', views.YaziListView.as_view(), name='list'),
    url(r'^(?P<slug>[\w-]+)/$', views.YaziDetailView.as_view(), name='detail'),
)

Bunu şimdi asıl URL ayarlarına eklememiz gerekiyor. Kökteki urls.py dosyasını açın ve şu şekilde düzenleyin.

from django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'ilkProjem.views.home', name='home'),
    # url(r'^ilkProjem/', include('ilkProjem.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
    url(r'^blog/', include('mikroblog.urls')), # işte uygulamamız bu url'den erişiliyor
)

Uygulamamız yavaş yavaş şekillenmeye başladı. Şimdi templates dizinine girin ve önceden oluşturduğumuz mikro_list.html dosyasını açın içerisine şu kodları girin. Tam bir tasarım değil ama bilgiyi şu anlık görebilmemiz için gerekli. Bu bizim yazdığımız yazıların gösterileceği sayfa. Yani anasayfa akışı da diyebiliriz.

{% load url from future %}
<h1>Yazılar</h1>

{% for mikro in object_list %}
    <li><a href="{% url 'detail' mikro.slug %}">{{ mikro.yayinlanma_tarihi|date }} - {{ mikro.baslik }}</a></li>
{% empty %}
    <li>Daha yazı yazılmamış. Lütfen yönetici panelinizden yazı yazın!.</li>
{% endfor %}

Bu süslü parantezler arasına istediğimiz çoğu şeyi yazabiliyoruz. Değişkenler, if ve while sorguları… İşte Django’yu sevmek için ayrı bir neden daha! Şimdi mikroblog klasöründeki views.py’yi açın ve aynen kopyalayın.

# Create your views here.

from django.views.generic import ListView, DetailView
from models import Mikro

class YayinlanmisYazilar(object):
    def get_queryset(self):
        return self.model.objects.live()

class YaziListView(YayinlanmisYazilar, ListView):
    model = Mikro

    def get_context_data(self, **kwargs):
        context = super(YaziListView, self).get_context_data(**kwargs)
        return context

Şimdi yazımızın detaylı olarak gösterileceği kısma girelim. mikro_list.html‘in bulunduğu dizinde bir de mikro_detail.html dosyası açın ve aşağıdakini içine yapıştırın.

{% load url from future %}
<h1>{{ object.baslik }}</h1>

<p>{{ object.icerik|linebreaks }}</p>

<strong>{{ object.yazar }} bu yazıyı {{object.yayinlanma_tarihi}} tarihinde yazdı.</strong>

<p>
<a href="{% url 'list' %}">Anasayfa</a>
</p>

Burada dikkat çekmek istediğim bir noktada var. anasayfa kısmına bakarsak, a elementinin href değeri “{% url ‘list’ %}” olarak ayarlanmış. Şimdi yukarıya çıkın ve mikroblog dizini içerisindeki urls.py’yi açın. Orada name=’list’ gözüne çarpacaktır. İşte anasayfanın URL’sini yazmış bulunuyoruz.

Tabi bu HTML Template’i render etmemiz için views.py’yi açıp sonuna şu sınıfı da eklemek gerekli.

class YaziDetailView(YayinlanmisYazilar, DetailView):
    model = Mikro

    def get_context_data(self, **kwargs):
        context = super(YaziDetailView, self).get_context_data(**kwargs)
        return context

Her şey tamam olduğuna göre Python Shell’ini açıp bir adet yazı ekleyelim. ilkProjem dizinindeyken şu komutu çalıştırıp…

python manage.py shell

… ardından şunları girmeniz yeterli:

Python 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from mikroblog.models import Mikro
>>> from django.utils import timezone
>>> from django.contrib.auth.models import User
>>> yazar = User.objects.get(id=1)
>>> yazi = u'Şu an bunu okuyorsanız başarıyla kurdunuz demektir :) '
>>> tarih = timezone.now()
>>> baslik = u'Düşünme, yap!'
>>> n = Mikro(yayinlanma_tarihi=tarih, baslik=baslik, icerik=yazi, yayinlanmis=T
rue, yazar=yazar)
>>> n.save()
>>> Mikro.objects.all()
[<Mikro: D├╝┼ş├╝nme, yap!>]
>>> Mikro.objects.get(pk=1)
<Mikro: D├╝┼ş├╝nme, yap!>

Girdikten sonra sunucumuzu çalıştırıyoruz (manage.py ile çalıştırabilirsiniz). Ardından aşağıdaki adrese giriyoruz:

http://127.0.0.1:8000/blog

İşte tamam!

Yazılar sayfası

Şimdi “Düşünme, yap!” başlığına tıklayıp yazdığımız yazıya bakalım.

Yazı içeriği

Sorun yok gibi gözüküyor. Ama hala eksiği bitmedi. Şimdilik bu kadar ama sonraki yazıyı da şiddetle okumanızı tavsiye ediyorum. Çünkü Django Admin Paneli entegresini yapacağız. Oradan yazı ekleyip silebileceğiz, yazıyı düzenleyebileceğiz ve yayınlanma durumunu kontrol edebileceğiz.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir