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

Geçen yazımızda modellerimizi oluşturup Django ile mikroblogumuzu yapmıştık. Bir adet yazı eklemiştik ve başarılı şekilde çalıştırmıştık. Şimdi ise Django’nun gelişmiş yönetim panelinden bahsetmek istiyorum. Bu yönetim paneline istediğimiz şekilde müdahale edebiliriz. Genelde yaptığımız uygulamalar için bir dosya oluşturup o dosyadan müdahale ediyoruz. Şöyle de denilebilir bir çeşit hook sistemi var. Yazdığımz uygulamaya göre şekilleniyor. Bu şekillendirmeleri uygulamanın dizininde admin.py adında bir dosya oluşturarak yapabiliyoruz.

Dosyayı oluşturduğumuzda aşağıdakileri yazıyoruz.

from django.contrib import admin
from .models import Mikro

class MikroAdmin(admin.ModelAdmin):
    date_hierarchy = 'yayinlanma_tarihi'
    fields = ('yayinlanmis','baslik','slug','icerik','yazar')
    list_display = ('baslik','yayinlanma_tarihi','yayinlanmis')
    list_display_links = ['baslik']
    list_filter = ['yayinlanmis','guncelleme_tarihi','yazar']

    prepopulated_fields = { 'slug' : ('baslik',) } 
    search_fields = ['baslik','icerik']

admin.site.register(Mikro, MikroAdmin)

Mikro modelini, MikroAdmin sınıfıyla yönetici paneline kayıt etmiş bulunduk. “list_display”e baktığımızda yazıların listeleneceği bölümde yayınlanma durumunu, tarihini ve başlığını göstereceğini belirttik. Bir de arama bölümü oluşturduk ki başlığa ve içeriğe göre arama yapabiliyor. Birkaç tane de filter oluşturduk. Bunlar yayınlanan yazılar, güncelleme tarihi en yüksek olan yazılar ve yazar ismine göre. Şimdi sunucunuzu çalıştırın ve yönetim paneline girin. Mikros seçeneğine tıklayın.

Gördüğünüz üzere bazı yerle Türkçeleştirme gerektiriyor. models.py dosyanızı açın ve burada Mikro modeline şunları ekleyin.

def yayinlanmis_admin(self):
        if self.yayinlanmis:
            return True
        else:
            return False

    def baslik_admin(self):
        return self.baslik

    def yayinlanma_admin(self):
        return self.yayinlanma_tarihi

    # Admin paneli için tasarım özelleştirmeleri

    yayinlanmis_admin.admin_order_field = 'yayinlanmis'
    yayinlanmis_admin.short_description = 'Yayınlanmış'
    yayinlanmis_admin.boolean = True

    baslik_admin.admin_order_field = 'baslik'
    baslik_admin.short_description = 'Yazı Başlığı'

    yayinlanma_admin.admin_order_field = 'yayinlanma_tarihi'
    yayinlanma_admin.short_description = 'Yayınlanma Tarihi'

Ekledikten sonra models.py dosyanız şu şekilde olmalıdır.

#-*- 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']

    def __unicode__(self):
        return self.baslik

    def yayinlanmis_admin(self):
        if self.yayinlanmis:
            return True
        else:
            return False

    def baslik_admin(self):
        return self.baslik

    def yayinlanma_admin(self):
        return self.yayinlanma_tarihi

    # Admin paneli için tasarım özelleştirmeleri

    yayinlanmis_admin.admin_order_field = 'yayinlanmis'
    yayinlanmis_admin.short_description = 'Yayınlanmış'
    yayinlanmis_admin.boolean = True

    baslik_admin.admin_order_field = 'baslik'
    baslik_admin.short_description = 'Yazı Başlığı'

    yayinlanma_admin.admin_order_field = 'yayinlanma_tarihi'
    yayinlanma_admin.short_description = 'Yayınlanma Tarihi'

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.baslik)
        super(Mikro, self).save(*args, **kwargs)

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

Burası tamam olduğuna göre admin.py dosyasını yeniden düzenlememiz gerekiyor. Aşağıdaki kodları dosyaya aynen yapıştırırsanız sorun yaşamazsınız.

from django.contrib import admin
from .models import Mikro

class MikroAdmin(admin.ModelAdmin):
    date_hierarchy = 'yayinlanma_tarihi'
    fields = ('yayinlanmis','baslik','slug','icerik','yazar')
    list_display = ('baslik_admin','yayinlanma_admin','yayinlanmis_admin')
    list_display_links = ['baslik_admin']
    list_filter = ['yayinlanmis','guncelleme_tarihi','yazar']

    prepopulated_fields = { 'slug' : ('baslik',) } 
    search_fields = ['baslik_admin','icerik']

admin.site.register(Mikro, MikroAdmin)

Bu da tamam olduğuna göre yönetim panelini tekrar açabiliriz. Şimdiki görüntü şuna benzer olacaktır.

Ama o da ne? Nesnelerimiz “mikro” olarak geçiyor. Hatta aşağıda da “2 mikros” yazıyor :) Bunu düzeltmek için models.py dosyamızı açıp, Mikro sınıfının içerisinde bir alt sınıf olan Meta’da düzenleme yapmamız gerekiyor.

    class Meta:
        ordering = ['-yayinlanma_tarihi','baslik']
        verbose_name = 'Mikro Blog'
        verbose_name_plural = 'Mikro Blog'

verbose_name ve verbose_name_plural ile bu sorunun üstesinden gelebiliriz.

Şu anlık bu kadar! Yazılarınızı düzenleyebilirsiniz ve yeni yazılar ekleyebilirsiniz. Filtrelerden geçirebilirsiniz. Diğer yazımızda yan menüdeki filtre isimlerinin değiştirilmesinden ve yazı düzenleme kısmının düzenlenmesinden bahsedeceğiz.

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.

Django “Merhaba Dünya” Uygulaması ve Ayarlar

Önceki yazımızda Django’yu Windows 8 bilgisayarımıza kurmuştuk ve çalıştığına dair bir ekran çıktısı almıştık. Şimdi ise Django’muzu kullanmaya başlayabiliriz. İlk olarak ayarlarımızı yapacağız. Ayarlarımızı yaptıktan sonra fonksiyon sistemine geçeceğiz. Ardından URL’leri düzenleyeceğiz ve aynı PHP’deki gibi URL’den GET metoduyla bilgi alacağız. Bunun üzerine mesela blog sisteminde olduğu gibi URL’den aldığımız veriyi işleyeceğiz. Şimdi başlayalım. Öncelikle projemizin içerisinden settings.py dosyasını bulalım. Bu dosya şuna benzer olacaktır.

# Django settings for ilkProjem project.

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': '',                      # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': '',
        'PASSWORD': '',
        'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    }
}

# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
ALLOWED_HOSTS = []

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
TIME_ZONE = 'America/Chicago'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = True

# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/var/www/example.com/media/"
MEDIA_ROOT = ''

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://example.com/media/", "http://media.example.com/"
MEDIA_URL = ''

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/var/www/example.com/static/"
STATIC_ROOT = ''

# URL prefix for static files.
# Example: "http://example.com/static/", "http://static.example.com/"
STATIC_URL = '/static/'

# Additional locations of static files
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

# Make this unique, and don't share it with anybody.
SECRET_KEY = 'ta=bk-$^8!x)+x*10zjf=q^stg19h%%&ub5#vv3rwk7&ryl3^z'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'ilkProjem.urls'

# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'ilkProjem.wsgi.application'

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

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',
)

# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}

Böyle bir dosyamız olacak. Bu dosyamızın birkaç bölümünü değiştirmeliyiz. Öncelikle saat kısmını düzeltelim.

TIME_ZONE = 'America/Chicago'

Bunu kendi zaman dilimimize ayarlayalım.

TIME_ZONE = 'Europe/Istanbul'

Bunu ayarladıktan sonra dili ayarlamamız lazım. LANGUAGE_CODE değişkenini tr-TR olarak değiştirmemiz gerekiyor.

LANGUAGE_CODE = 'tr-TR'

Basit ayarlamalarımız bunlar. settings.py dosyasını dikkatli şekilde okuyarak diğer ayarları siz yapabilirsiniz. Ama en temel ayarlar bunlardır.

Merhaba Dünya

Her şey ‘Merhaba Dünya!’ ile başlamış olabilir aslında. Belki Adem ve Havva da cennetten dünyaya geldiklerinde de bu söz öbeğini kullanmış olabilirler.Kim bilir!

İlk merhaba dünya uygulamamız için öncelikle views.py dosyamızı açmalıyız. Bu dosya istekleri işliyor. Fonksiyonlarımızı buraya yazarak işimizi hallediyoruz.  Eğer dosya yoksa oluşturun :)

İlk fonksiyonumuzu yazmaya hazırsak hemen yazalım.

Bu dosya views.py dosyası olacak.

#-*- coding: utf-8 -*-
from django.http import *

def MerhabaDunya(request):
    merhaba = '<strong style="color:red">Merhaba</strong> dünya! <br>'
    user = 'Kullandığınız tarayıcının gönderdiği User-Agent:<br>%s'% request.META['HTTP_USER_AGENT']

    return HttpResponse(merhaba+user)

Şimdi urls.py dosyamızı açıyoruz. Bu kısım önemli özellikle ‘Merhaba Dünya’mızı görmek istiyorsak. urls.py’yi açıp kopyalayın.

from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

import views

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'^merhaba-dunya/$', views.MerhabaDunya)
)

Gördüğünüz gibi daha demin yazdığımız views.py’yi import ettik ve patterns’e bir adet eleman ekledik. Elemanımızda url fonksiyonunu kullandık ve yapılacak işlem için views.MerhabaDunya fonksiyonunu kullandık ki bu fonksiyonu önceden yazdığımız fonksiyondu. Artık http://127.0.0.1:8000/merhaba-dunya/ adresine girerek uygulamamıza bakabiliriz.

ve Django ile 'Merhaba Dünya' diyoruzUser-Agent değerini de request.META[‘HTTP_USER_AGENT’] ile halletmiş olduk. Sonunda Django ile de dünyaya bir ‘Merhaba!’ dedik!

Django ilk uygulamamızı yazıyoruz – 1

Django’da ‘Merhaba Dünya!’ uygulamamızı yaptıktan sonra artık uygulama geliştirmeye başlayabiliriz. Ama ilk önce uygulamamızın yönetimi için Django’nun gelişmiş yönetim panelini etkinleştirmemiz gerekiyor. Yönetim panelini etkinleştirdikten sonra Twitter benzeri bir uygulama yapabiliriz. Ardından template sistemini kullanarak yaptığımız uygulamayı webe aktaracağız. Django’nun veritabanı ayarını yapabilmek için bir veritabanı sunucusu kurmamız lazım. Django ile en iyisi PostgreSQL. Ama MySQL de kullanılabilir. İkisi içerisinde ayarlamalar aynı denilebilir.

Şimdi projemizin ilkProjem/settings.py dosyasını düzenlememiz gerekiyor. Dosyayı açtıktan sonra şu kısmı düzenlememiz gerekiyor.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': '',                      # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': '',
        'PASSWORD': '',
        'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    }
}
  • Django 4 adet veritabanı tipi destekliyor. Bunlar PostgreSQL, MySQL, Sqlite ve Oracle. ENGINEdeğerinin sonuna kullanmak istediğiniz uygulama için veritabanı tipini yazacaksınız. Biz MySql kullandığımız için ‘mysql’ ekledik.
  • NAME kısmı veritabanı adı. Oluşturduğunuz veritabanı adını girin.
  • USER ve PASSWORD için kullanıcı adı ve şifrenizi girin.
  • HOST için şu değeri girin: 127.0.0.1 . Bu veritabanını bulunduğu sunucu adresi. Yani yerel makine.
  • PORT’u boş bırakabilirsiniz.

Bunları yaptıktan sonra şuna benzer bir görüntü elde edeceğiz.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'ilkProjem',                      # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': 'root',
        'PASSWORD': '',
        'HOST': '127.0.0.1',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    }
}

Ardından Windows için MySQLdb eklentisini kurmamız gerekiyor. Bu adresten Windows kurucusunu indirip kurduktan sonra INSTALLED_APPS değişkenine gelip aşağıdakileri ‘uncomment’ etmeniz gerekiyor. Yani önündeki ‘#’ işaretini kaldırmanız gerek.

  • django.contrib.admin
  • django.contrib.admindocs

Şimdi ilkProjem/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)),
)

Bu da tamamlandığına göre her şey hazır demektir. Şimdi komut satırını açıp, projemizin dizinine geçmek gerekiyor. Ben masaüstümdeki Django dizinine kurmuştum projeyi. Şimdi oraya geçip şu komutu yazmam gerekecek.

cd Desktop
cd Django
cd ilkProjem
python manage.py syncdb

Bunu yazdıktan sonra tabloların oluşturulduğuna dair mesajlar alacaksınız ve ardından SuperUser oluşturmanız için bilgilerinizi isteyecek. O bilgileri yazdıktan sonra yönetici paneline girebileceksiniz. İşte ekran görüntüsü.
Syncdb komutundan sonraki ekran görüntüsüArtık yönetici panelinize giriş yapabileceksiniz. Konsolda oluşturduğunuz süper kullanıcı ile giriş yapıyorsunuz. Şimdi sunucuyu çalıştırmak için şu komutu yazalım: python manage.py runserver

Ardından giriş yapmak için şu adrese gitmeniz yeterlidir: http://127.0.0.1:8000/admin/

Django Admin PaneliYönetim için dökümantasyonu açmak için Python docutils modülünü yüklememiz gerek. Onu buradan indirebilirsiniz. İndirdikten sonra bilgisayarınızın düzenli olması namına Python’ın kendi dizini içerisine komple çıkartıp, ardından install.py’yi çift tıkla çalıştırırsanız kurulacaktır. Sonra Django’yu yeniden başlatmamız gerekiyor. Bunun için de CTRL+C ile sunucuyu kapatıp önceki komutu tekrarlamanız yeterli. Artık dökümantasyon da kullanıma hazır.

Şu anlık Türkçe değil ama işimizi görürNe yazık ki şu anlık Türkçe’ye çevrilmemiş vaziyette. Ama burada çoğu fonksiyonu ve template sistemini öğrenebilirsiniz. Anasayfadan yeni kullanıcılar ekleyebilir ve gruplar oluşturabilirsiniz. Bunun dışında sitelerinizi de kontrol edebilirsiniz.

Djangoya giriş ve windows kurulumu

Temmuz ayının sıcak günlerinde beynimin pişmesiyle beraber laflarımın çoğunu Python ve Django oluşturmaya başladı. Django demeye başlayınca çevrem “Django da ne yaaaaa” demeye başladı. Django’yu Google’da olduğu gibi aratırsanız film adı çıkıyor. Ama bu değil. Django’nun ne olduğunu, bize neler getirdiğini, avantajlarını ve en önemlisi nasıl kurulacağını anlatacağım. Eğer bir terslik de çıkmazsa Django ile ilgili yazılarımı yazacağım ve püf noktalarını anlatacağım. Django için en genel tanım bir web framework’udur.

Django Web Framework

Django bir web framework’üdür ve Python dili ile yazılmıştır. Açık kaynak olarak dağıtılmaktadır ve geliştirilmektedir. Python altyapısını kullanır. MVC yapısını kullanır.

Kendine özgü template sistemiyle dinamik sitelerinizi rahatlıkla oluşturabilirsiniz. Oldukça gelişmiş bir URL yapısı vardır ki 5 dakikada sadece urls.py dosyasını düzenleyerek SEF linkler yaratabilirsiniz. Ayrıca hem sunucuyla etkileşim, hem de web yazılımı yapmak istiyorsanız gayet etkili bir yapısı var. Python’ın masaüstü yazılım gücüyle Django’nun webdeki gücünü birleştirerek oldukça güzel uygulamalar yapılabilir.

Ayrıca hızlı çalışır ve kaynak sıkıntısı çekmezsiniz. Az kaynağa sahip sunucularda bile gayet performanslı çalışır.

İlk olarak Django’nun son sürümünü indirmemiz gerekiyor. Django’yu bu sayfadan indirdikten sonra Python kurmamız gerek. Django’yu indirdiyseniz, arşiv dosyasını ben C: klasörüne açtım. İstediğiniz bir yere açın. Şimdi Python kurmamız gerekiyor. Python’ın 3.x.x sürümlerine tam olarak hakim olamadığım için ben 2.x.x sürümlerini indiriyorum. Bu sayfadan Python’ı indirdikten sonra ortam değişkenlerinden ‘Path’ değişkenine Python yolunu eklememiz gerekiyor.

Python’ı ben C:\Python27 klasörüne kurdum. Sürümüm 2.7 olduğu için böyle bir ad aldı. Şimdi komut satırından ‘python’ı çalıştırmak için ortam değişkenlerini düzenlememiz gerekiyor.

Python CMD

Gördüğümüz gibi ‘python’ yazınca uygulamayı çalıştıramıyoruz. Çalıştırmak için ortam değişkenlerini düzenlememiz gerek. Windows 8 kullanırken aramadan ‘ortam değişkenleri’ diye aratırsanız, 2 adet sonuç alırsınız. Siz sistem ortam değişkenlerini düzenleyeceksiniz. Şimdi ‘Path’ isimli değişkeni seçin ve düzenleye tıklayın. Ardından Python’ı nereye kurduysanız o klasörün yolunu belirtmemiz gerekecek yani şöyle.

Python PathKaydettikten sonra konsolda ‘python’ yazıp çalıştırabiliriz.

Düzgün şekilde çalışıyorŞimsi Django’yu çıkarttığımız dizine gidip Django’yu kurabiliriz. Django’yu indirmiştik ve bir dizine açmıştık. Ben Django’yu C:\Django-1.5.1 dizinine kurdum. Şimdi o dizinin içine cd komutu ile giriyorum. Ardından şu komutu yolluyorum.

python setup.py install

Django kurulmaya başlayacaktır. Konsolumuz bir yığın şeyle dolacaktır. Şimdi ilk projemizi yaratmamız için Django’yu kurduğumuz dizin içerisinden django-admin.py dosyasını bulmalıyız. Onu bulduktan sonra masaüstüne veya herhangi bir müsait yere atıp oradan çalıştıracağız. Gene ben bu dosyayı bulup C:\Users\user\Desktop\Django\ dizinine attım. Bu dizinden çalıştırıyorum. Şimdi ilk projemizi oluşturalım. django-admin.py dosyasını çalıştıracağız.

django-admin.py startproject ilkProjem

Eğer konsol ekranında bir şey görünmüyorsa ve django-admin.py’nin bulunduğu dizinde ilkProjem diye bir klasör oluştuysa başarıyla Django’da proje oluşturdunuz demektir. Klasörün içine girdiğinizde karşınıza manage.py dosyası çıkacaktır ve proje adıyla bir klasör daha. Şimdi ilk projemizi çalıştıralım ve Python’dan biraz yararlanalım. Gelecek yazılarımızda ise nasıl ‘Merhaba Dünya!’ diyeceğimizi ve SEF Url sistemini yapacağız. Oluşturduğunuz projeyi çalıştırmak için yapmanız gereken django-admin.py dosyasının bulunduğu dizinden, oluşturduğunuz projenin bulunduğu dizine geçmek. Yani sırasıyla yapmanız gerekenler:

cd ilkProjem

python manage.py runserver

Bu komutları da yazdığınızda karşınızda şöyle bir çıktı olacaktır.

Validating models...

0 errors found
July 12, 2013 - 22:16:23
Django version 1.5.1, using settings 'ilkProjem.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

Şimdi http://127.0.0.1:8000 adresine giriyoruz …

[12/Jul/2013 22:19:07] "GET / HTTP/1.1" 200 1960

… sonuç başarılı projemiz çalışıyor. Dikkat ederseniz konsolda isteklerin gelişini de görebilirsiniz.

Tebrikler, Django’yu başarıyla kurdunuz ve ilk projenizi yaptınız!