23 Eylül 2008 Salı

Django ile Anket

Bu uygulamamızın temel amacı django ile admin panelini anlatmak olacak. O yüzden onun dışında kalan bölümleri hızlıca geçeceğim.O bölümler daha önce gökmen ve mirat tarafından ayrıntılı olarak anlatılmıştı. Eğer başlangıçtaki bazı örnekleri anlayamazsanız daha önce yazılmış django notlarından faydalanabilirsiniz.

Şimdi yeni bir proje başlatmak için gerekli olan komutumuzu veriyoruz.

Deniz@ParMak ~ $ django-admin.py startproject OrnekProje

OrnekProje adıyla yeni bir projeye başladık şimdi o dizine geçip uygulamamıza devam edelim.

Deniz@ParMak ~ $ cd OrnekProje/


Şimdi de projemiz içerisinde yeni bir uygulama başlatalım.
Not: Uygulamalar genellikle belirlir bir görevi yerine getirmek üzere kullanılırken. Projeyi ise içinde bir çok uygulamayı içerisinde düzenli şekilde barındıran uygulamalar bütünü olarak tanımlayabiliriz. Yine uygulamalarımızı bir kere oluşturup farklı projeler içerisinde de kullabiliriz.

Deniz@ParMak OrnekProje $ python manage.py startapp anket

Projemiz içerisinde anket isimli bir dizin oluştuğunu göreceksiniz içinde ise "__init__.py __init__.pyo models.py models.pyo views.py views.pyo " dosyaları mevcuttur.

models.py dosyası bizim modellerimizi tanımlayacağımız dosya olacak. Anket uygulaması için 2 model oluşturacağız: Anket ve Secim. Anket içerisinde soru ve yayın tarihi yer alırken Secim içerisinde secenekler ve oylar alanları yer alacak. Bunun için aşağıda ki kodları models.py dosyamıza kaydediyoruz.

from django.db import models

class Anket(models.Model):
soru = models.CharField(max_length=200)
yayin_tarihi = models.DateTimeField('yayin tarihi')

class Secim(models.Model):
anket = models.ForeignKey(Anket)
secenek = models.CharField(max_length=200)
oylar = models.IntegerField()


Şimdide bir üst dizinde yer alan settings.py dosyasında INSTALLED_APPS kısmını şu şekilde düzenliyoruz.


INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'OrnekProje.anket',
)


Şimdi veri tabanı ayarlarını düzenliyoruz. (Ayrıntılı bilgi için miratın yazını inceleyiniz.


DATABASE_ENGINE = 'mysql' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'veritabanı_ismi' # Or path to database file if using sqlite3.
DATABASE_USER = 'Deniz' # Not used with sqlite3.
DATABASE_PASSWORD = 'şifrem' # Not used with sqlite3.
DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3.

Eğer Pardus kullanıyorsanız Tasma-Servis Yöneticisinden mysql_server'i çalıştırmayı unutmayınız.

Ardından bakalım az önce models.py içerisine pythoncasını yazdığımız modellerin mysql karşılıkları nelermiş ?

Deniz@ParMak OrnekProje $ python manage.py sql anket
BEGIN;
CREATE TABLE `anket_anket` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`soru` varchar(200) NOT NULL,
`yayin_tarihi` datetime NOT NULL
)
;
CREATE TABLE `anket_secim` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`anket_id` integer NOT NULL,
`secenek` varchar(200) NOT NULL,
`oylar` integer NOT NULL
)
;
ALTER TABLE `anket_secim` ADD CONSTRAINT anket_id_refs_id_4e3e5fcb FOREIGN KEY (`anket_id`) REFERENCES `anket_anket` (`id`);
COMMIT;


Eğer benzer bir çıktı aldıysanız herşey yolunda devam edebiliriz.
Eğer bir hata almadıysanız djangoya az önceki sql komutlarını çalıştırmasını söylemek için aşağıda ki komutu giriyoruz.

python manage.py syncdb

Çıktısında şöyle birşey göreceksiniz.

Creating table anket_anket
Creating table anket_secim
Installing index for anket.Secim model

Şu ana kadar veri tabanı ayarlarımız yaptık şimdi Admin paneliyle ilgili ayarlarımıza geçiyorum.

Tekrar setting.py dosyasını açıp INSTALLED_APPS bölümüne az önceki örnekteki gibi 'django.contrib.admin' satırını ekliyoruz.

Ardından tekrar python "manage.py syncdb" komutunu verip veri tabanını güncellemesini istiyoruz. Bu esnada sizden admin paneline girişte kullanmanız için bir kullanıcı adı ve şifresi isteyecek gerekli ayarları yapıp devam ediniz.

Son olarakta urls.py dosyasının başında admin paneli için gerekli olan modülleri yüklemek için # işaretini kaldırıyoruz. Ve yine o dosyanın sonundaki admin alanını djangoya göstermek için oradan da # işaretini kaldırıyoruz.
Yani dosyanın en son hali şu şekilde olacak.

from django.conf.urls.defaults import *

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

urlpatterns = patterns('',
# Example:
# (r'^OrnekProje/', include('OrnekProje.foo.urls')),

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

# Uncomment the next line to enable the admin:
(r'^admin/(.*)', admin.site.root), #burasını
)

Şimdi django sunucusunu çalıştıralım.

python manage.py runserver

Şimdi tarayıcınızdan http://127.0.0.1:8000/admin/ adresini açıp neler olduğuna bakabilirsiniz :)

Biraz kurcalayınca Gruplar,Kullanıcılar ve Siteler adında 3 bölüm göreceksiniz. Bunlar django ile öntanımlı olarak gelen admin paneli araçlarıdır. Fakat sanki bizim anket piyasada görünmüyor ? Bunun için yapmamız gereken tek birşey daha kaldı. Anket dizini içerisine admin.py adında bir dosya oluşturup içerisine şu satırları eklemek.

from OrnekProje.anket.models import Anket
from django.contrib import admin

admin.site.register(Anket)


Şimdi sunucumuzu yeniden başlatalım.(Ctrl+c) ile sonlandırıp. python manage.py runserver ile yeniden başlatabilirsiniz.

Eğer bir aksilik çıkmadıysa artık admin panelinde anket uygulamımızı görmüşsünüzdür. Aslında buradan sonra anlatılacak pek birşey kalmıyor ama ben kısaca bir kaç ufak şeyden bahsedeyim.

*Anketlere girdiğimizde görmüş olduğumuz form anket modelinde yazmış olduğumuz koda göre django tarafından otomatik olarak oluşturuluyor.

*Anket modelinde oluşturduğumuz alanları hatırlayacak olursanız (DateTimeField, CharField gibi) django bunlara bakarak admin panelinde ona göre bir html üretiyor.

*Örneğin DateTimeField ile gün ayarı yapabileceğimiz bir JavaScript kısayolunu bizim için panele ekliyor.

Şimdilik bu kadarla kesiyorum. Admin panelinide kendi isteğimize göre özelleştirebiliyoruz. İlerleyen günlerde bu ufak tefek özelleştirmelerden de bahsedebilirim.

17 yorum:

  1. Peki bu anket uygulamasında oluşturmuş olduğumuz bir anketi, uygulamamızın anasayfasında, ufak bir modül olarak göstermek istersek nasıl bir yol izleyeceğiz? Bir sonraki makalede yada buraya yorum olarak değinebilirseniz sevinirim. ( views.py içerisine Anket modelini import edip, veritabanı sorgusu ile son anketi alıp bu ankete ait verileri template dosyasına mı göndereceğiz? Yoksa onun içinde bir kısayol düşünmüş mü Django'cu abiler :) )

    YanıtlaSil
  2. "views.py içerisine Anket modelini import edip, veritabanı sorgusu ile son anketi alıp bu ankete ait verileri template dosyasına mı göndereceğiz?"

    Aynen öyle. Bir sonraki yazıya onuda ekleyelim o zaman ;)

    YanıtlaSil
  3. Sanırım anket 3 yazısı sizin sorunuza cevap olacak nitelikte ? :)

    YanıtlaSil
  4. Evet :) Okudum. Teşekkürler.

    YanıtlaSil
  5. admin.autodiscover() << bu ne işe yarıyor?

    YanıtlaSil
  6. Kural ;)
    Django 1.0 la gelen bir özellik.
    http://docs.djangoproject.com/en/dev/releases/1.0-porting-guide/#urls

    Ayrıca eğer 1.0 kullanıyorsan urls.py'de otomatik olarak şöyle bir ifade de var.

    # Uncomment the next two lines to enable the admin:

    YanıtlaSil
  7. slm arkadaslar
    yukaridaki kodlari calistirdim admin panelinde sorunyok fakat böyle bir hata aliyorum ne yapmam gerek?
    Using the URLconf defined in ilksite.urls, Django tried these URL patterns, in this order:

    1. ^admin/(.*)

    The current URL, , didn't match any of these.

    YanıtlaSil
  8. urls.py dosyasında tamımlamadığınız url'lere ulaşmaya çalıştığınızda böyle bir hata alabilirsiniz. Şu anda urls.py dosyanızda sadece ^admin/ sayfasına girebilirsiniz gibi görünüyor. Diğer url'ler için urls.py dosyasında gerekli düzenlemeyi yapmalısınız.

    YanıtlaSil
  9. Merhaba arkadaşlar;
    her yerde dijangonun web için kolaylıklarından bahsedilmiş ama bir iki örnek inceledim ve yine kodları yazıyosunuz . Sağladığı kolaylık sadece bir komutla gerekli dosyaları oluşturmasımı. Anlamadım ben bu dijangoyu..

    YanıtlaSil
    Yanıtlar
    1. Selam,

      Bu blogpostta ortada hic bir proje yok iken database tablolari ile beraber 0 dan bir proje kurulmasi anlatilmis. Aslinda yazilmis temel bir application bile yok burada. djangonun admin applicationi kullaniliyor sadece. Sizin beklemekte oldugunuz kolaylik anlaminda bu postta anlatilmis olan

      1) start-project - yeni proje templateinin olusturulmasi (development serveri ile beraber)
      2) syncdb- database tablolari constraint ve indexlerinin olusturulmasi (initial data varsa eklenmesi.)
      3) admin arayuzu - database arayuzu diyebiliriz sanirim.

      var. Fakat her halukarda kod yazmak zorundasiniz cunku django bitmis bir product degil bir framework. Djangonun yapisini daha iyi anlamak icin hazir yazilmis django applicationlarinin kodlarini incelemenizi onerebilirim. Github da bir cok app mevcut.

      Sil
  10. Ne bekliyordunuz, ben de onu anlamadım.

    YanıtlaSil
  11. verdiğniz kodların büyük çoğunluğu yanlış, sadece okunması ve reklam getirmesi için yazılmış bir yazı

    YanıtlaSil
    Yanıtlar
    1. Selam,
      Kodlari inceledim ve herhangi bir yanlislik goremedim. Zaten herhangi bir kodda yok burada. blogpost kisaca sunlari anlatmis
      1)yeni proje olusturmak
      2)iki tane model eklemek
      3) databasei initialize etmek (syncdb calistirildigi zaman database uzerindeki tablolar indexler constraintler otomatik olarak olusturulur. bu esnada dataaseimizde 10 tane filen tablomuz olmasi gerkeiyor.)
      4) admin arayuzunun enable edilmesi. Durum soyle, django genel olarak her applicationda kullanilabilecek olan 10-15 tane application ile gelir. bunlardan birtanesi admin applicationi. admin applicationi enable edildiginde. projede olan modeller icin bir arayuz otomatik olarak olusturulur.

      Bu blogpost u tam olarak takip ederseniz elinizdeki application calisir halde olmali gibi geldi bana. Takildiginiz yada yanlis oldugunu dusunuduguz bir yer var ise sorarsaniz eminim yaziyla ilgilenen arkadaslar acikliyacak/yanlisligi duzeltecektir.

      Sil
    2. Huseyin selamlar, ayrintli cevabin icin tesekkur ederim.
      Ben cevap verme ihtiyaci bile duymadim. Yorumu yazan sahis ne adini, ne mailini birakmis. Bir cevap yazsak da haberdar olma ihtimali dusuk.

      Sil
  12. sitenin bir yerinde reklam var da ben mi göremiyorum :)

    YanıtlaSil
  13. Arif'in Manchester'a attığı golü ararken buldum burayı, kodlar bozuk, yazmışsınız ama olmamış..

    YanıtlaSil
  14. Bu yorum yazar tarafından silindi.

    YanıtlaSil