0% found this document useful (0 votes)
110 views107 pages

Django

Django

Uploaded by

Murat Yener
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
110 views107 pages

Django

Django

Uploaded by

Murat Yener
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

DJANGO

iin Trke Klavuz


Yazan : Muslu Yksektepe

Teekkrler:
ahin MERSN
Serhan YILDIZ
Abdurrahman OLA
Umut KARCI

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
1
indekiler

1. Django Nedir? 3
2. rnek Siteler 3
3. Kurulum 5
Pip 6
ndir Kur 7
4. Dzenleme Arac (Editr) 9
5. Proje Oluturma 10
6. Proje Dosyalar 10
7. [Link] de Dil ve Zaman Ayarlar 12
8. lk [Link] Dzenleme 15
9. lk Admin Girii 17
10. collectstatic le Statik Dosyalar Kopyalama 17
11. createsuperuser le Yetkili Kullanc Oluturma 20
12. Ynetim Paneli Deitirme 21
13. Admin Templates Dosyalar Kopyalama 23
14. Admin Html Dosyas Deitir 24
15. Ynetim Paneli Gruplar 27
16. Ynetim Paneli Kullanclar 27
17. lk Uygulama Hazrl 28
18. MTV (Model Template View) rnei 30
19. Uygulama Ad Deitirme 34
20. Ynetim Sayfasnda Kstlamalar (ModelAdmin Filtreler) 36

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
2
DJANGO WEB ARAYZ

Merhaba arkadalar, uzun sre sonra tekrar Django web arayz


( framework ) hakknda yeni ve gncel bilgiler paylamak iin
tekrar beraberiz.

Zero2Hero eklinde ilerleyip, herkesin anlayabilecei ekilde


konuma diliyle yazacam.

Django nedir nce ksa bir bilgi verelim. Django; Python kodlaryla
hazrlanm bir web arayzdr. Yani Php ile hazrlanan
Wordpress, OpenCart, NukePHP gibi Django'da Python kodlaryla
gelitirilmi bir aratr diyebiliriz. Tam olarak Trke karl
terimi bulamyoruz ancak ksa srede web siteleri oluturmanz
salar.

rnek olarak birka web sitesi verebiliriz.

[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]

Daha fazlas: [Link]

Bir ok siteyi zaten tanyorsunuz.

Bunlar size Django ile neler yaplabilecei hakknda fikirler


verebilir. Python tm iletim sistemlerinde rahatlkla kullanld
iin Django'yu da tm iletim sistemlerinde kullanabilirsiniz.
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
3
Symbian, IOS, Android, Windows iletim sistemlerinde ve
Raspberry PI gibi kk bilgisayarlar zerinde Linux ve Windows
kurulumu yaplarakta kullanlabilir.
Her zaman sylediim gibi tm yazlm dilleri ayndr sadece
syntax (yazm ekli) deiir. Buradan yola karak Django'yu
gznzde zor diye bytmektense her eyi yapabilirim diye
bytmek daha iyidir.

Peki Django neden bu kadar ok firma tarafndan kullanlrken


Trkiye'de pek fazla destek grmyor?

Aslnda gryor ama klasik yazlm dilleri gibi ykle-kullan olarak


kullanlamyor. Klasik Asp, Php, [Link] gibi hosting alp
dosyalarnz ykleyip hosting firmanz ile grerek hemen
kullanmaya balayamyorsunuz. Django kullanmaya baladnzda
server (backend diyebiliriz) tarafn da sizin kontrol etmeniz
gerekir. Bir ok firma artk size vps destei vererek ssh ile balanp
kendi servernz kullanarak Django ile almanza yardmc oluyor.
Hatta hazr Django kurulumu yaptrlabiliyor.

Konuyu anlatmaya balarken en azndan bir ka yazlm diliyle


altnz kabul ederek devam edeceim. Hi bir yazlm dili ile
alma yapmadnz ya da henz karar vermediyseniz biraz
zorlanacaksnz ama yine de fikriniz oluacak.

Kurulum ve kullanma balayabiliriz.

Django projesi [Link] adresinde


tantlmakta ve anlatlmaktadr. Srekli gereksinimlere kar da
gncellenmektedir.

Bu arada projeye ba yapmay unutmayn.


[Link]

lk balayanlar veya gei yapanlar iin grdm en zor adm


kurulum aamas. Bu sebeple en uzun duracam konu buras
olacak.

u an son srm olarak 1.9 ( 1.9.1 ) hazrland. nceki srm 1.8 (


1.8.8 ) LTS yani uzun sre destek verilecek srmdr. Nisan
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
4
2018'e kadar da destek verilecek.

Bu konu hakknda da sorular geliyor.

Neden gncelleme yaplyor? Neden nceden yapmadlar?

Ksa bir rnek vereyim hemen, HTML5 ile gelen yeni zellikler iin
bile eklemeler yapld. JSONField
Dier birka konuya rnek gerekirse; sk kullanlan birok
komutlarn tek fonksiyonda toplanmas, gvenlik aklar yamalar
ya da veritabanlarnda yaplan deiikliklere eklenti salanmas.

Daha fazla merak edenler iin:


[Link]

Release End of mainstream


Release Date End of extended support2
Series support1
1.10 August 2016 April 2017 December 2017
1.11 LTS 3 April 2017 December 2017 Until at least April 2020
2.0 December 2017 August 2018 April 2019
2.1 August 2018 April 2019 December 2019
2.2 LTS April 2019 December 2019 Until at least April 2022
3.0 December 2019 August 2020 April 2021
[1] Gvenlik dzeltmeleri ve veri kayb hata, kme hatalar, yeni tantlan zellikleri nemli fonksiyonellik hatalar, Django eski srmlerinden gerilemeleri
[2] Gvenlik dzeltmeleri ve veri kayb hata
[3] Python 2.7 ile desteklenen son srm

*Daha iyi bir eviri gerekir.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
5
KURULUM

Kurulum iin farkl iletim sistemlerinde birok yol mevcut. Ben


Ubuntu zerinde alyorum ama dier iletim sistemlerine de
deineceim. Zaten kurulumdan sonra yazm aamasnda farkllk
yok.

Pip yntemi ile kurulum

pip ksaca python modllerini kurmamz iin gelitirilmi bir paket


yneticisi.

Ubuntu:
sudo apt-get install python-pip

Windows:
python -m pip install -U pip

Mac OS:
sudo easy_install pip
pip kurulumundan sonra pip ile kurulumlara balayabiliriz.

Kullanm rnei:
sudo pip install Django
sudo pip install Django=1.7.7

Mac OS:
sudo pip install django

Windows:
pip install django

Toplu kurulum iin


sudo pip install -r [Link]

Ben genelde pip'i kullanmay tercih ediyorum. Hem eski versiyonu


Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
6
otomatik kaldryor hemde tek bir dosya oluturup tmn bir
arada kurabiliyoruz.

ndir - Kur yntemi ile kurulum

[Link]

Yukardaki linkten [Link] (7.1MB) adnda sktrlm


bir dosya indirilecek.

* Windows kullananlar 7zip veya Winrar ile dosyay aabilirler.

Sktrlm dosyas atktan sonra aadaki gibi bir grnt


oluacak.

Linux:

muslu@muslu-MS-7641:~/ndirilenler/Django-1.9.1$

sudo python [Link] install

komutu ile kurulumu balatabiliriz.

django-admin version

komutu ile kurulumun doru tamamland kontrol edilir.

Tek satrda yapmak isterseniz:

cd ndirilenler/

tar -xzvf [Link] && cd Django-1.9.1/ && sudo python [Link]


install

django-admin version

Bonus: && kullanarak srayla komut ekleyebilirsiniz.

Alnabilecek hatalar:
[Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-
packages/.............
komutun bana sudo eklemeyi unuttunuz ve yetkiniz yok.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
7
sudo python [Link] install

olmal.

Windows:

Python kurulmu ve PATH alanna eklenmi olduu yani komut


satrnda python komutuna izin verilmi olmas gerekir.

python [Link] install

kurulum tamamlandktan sonra komut satrna python yazarak


python idesi alabilir.

import django
[Link]
exit()

komutlar djangonun kurulumu ve versiyonu kontrol edilebilir. Bu


komutlar dier iletim sistemleri iinde geerlidir.

Kurulum aslnda bu kadar zaten birok arkadata farkl


platformlarda kurulumlar gayet baarl anlattlar.

u an iin gerekli olarak grmediim virtualenv, shell kullanm


gibi konulara girmeyeceim.

Kontrolleri saladktan sonra Django artk hazr, sizi bekliyor.

Django'nun bilinen bir a yok yani sayfanzn hacklenme gibi bir


ey sz konusu deil. Tabi yazlmc hatalar olmazsa. Zaten html
dosyasna ynlendirme sizin elinizde olduu iin biri gelip
[Link]* dosyalarnn tmn deitirse bile sayfanza bir ey
olmayacaktr.

Eer bir hata alyorsanz bu gzel bir ey demek ve mutlaka birileri


bunu tecrbe etmi, nlemini alm ve aklamasn yapm.
Mmkn olduunca hatalar alp bunlarn aklamalarn
yapacam.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
8
DZENLEME ARACI

Dzenleme arac olarak ( editr ) ben JetBrains'e ait Pycharm (


Professional ) kullanyorum. lk videolarda Gedit kullanmtm ama
artk Pycharm ile anlatacam.

JetBrains editr konusunda ok baarl. Tm rnlerini denedim


ve fiyatlar da gerekten ok uygun.

[Link]

buradan kendi iletim sisteminize gre Pycharm' indirebilirsiniz.


Otomatik olarak linux gelecek.

Dierleri;

[Link]
[Link]

Hemen bir proje oluturarak artk almaya balayabiliriz ama


baz terimleri imdiden anlatmak gerekiyor.

Proje: Wikipedia' da bir probleme zm bulma ya da beliren bir


frsat deerlendirmeye ynelik, bir ekibin, balangc ve bitii
belirli bir sre ve snrl bir finansman dahilinde, birtakm
kaynaklar kullanarak, mteri memnuniyetini ve kaliteyi gz
nnde bulundururken olas riskleri ynetmek artyla,
tanmlanm bir kapsama uygun ama ve hedefler dorultusunda
zgn bir plan balatma, yrtme, kontrol etme ve sonuca
balama srecidir diye tanmlanyor.

Srekli duyduumuz bu terim aslnda bir fikrim var yerine


kullanlyor. Oysa ki fikir henz balanmam, eyleme geilmemi
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
9
ve aklclkla ilgilidir. Oysaki proje zaman belirlenmi, balanm,
planlanm ve ekip olarak tasarlanm fikirler ve eylemlermi.

Burada da proje; balang olarak yapmay istediimiz web


sitesinin genel addr.

rnek olarak; teknik servis takibi, salk oca sra takibi, kombin
rn sat sitesi vs..

Proje Oluturma
mkdir django (projelerinizin olaca klasr ad)
cd django (projelerimizin klasr)
django-admin startproject teknikservistakibi (proje oluturuyoruz)
cd teknikservistakibi/
ls -la
projemize ait bir klasr olutu ve iinde [Link] dosyas ve
proje ad ile ayn bir klasr daha oluturuldu.

* Django'nun eski versiyonlarnda bu klasr oluturulmuyor ve dosyalar direk


darda tutuluyordu.

* Proje oluturmay Pycharm'dan da yapabiliriz ama komut olarak renmeniz


daha iyi. nk her zaman bir editrnz olmayacak ve her zaman local de
alamayacaksnz.

muslu@muslu-MS-7641:~$ tree django/


django/
teknikservistakibi
[Link]
teknikservistakibi
__init__.py
[Link]
[Link]
[Link]

2 directories, 5 files

Bonus: tree komutu iin sudo apt-get install tree

[Link]: Proje ve uygulamalar ile ilgili komutlar


altracamz ynetim dosyas.

__init__.py: Genel kullanm bu klasrde python dosyalar


var demek ( Python paketlerini ieren dizinler ) ama yine bir py
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
10
dosyas olduu iin iine zel komutlar ya da aklamalar
eklenebilir.

[Link]: Adndan da anlalaca gibi ayarlarn


bulunduu dosya. Projenin tm ayrntlar burada. Wordpress'teki
[Link] gibi.

[Link]: Url ynlendirmelerinin yaplaca dosya. Ayn


zamanda fonksiyon da yazabiliriz.

[Link]: Http serverlar ( rnein Apache ve Nginx.


*libapache2-mod-wsgi ) iin proje ynlendirme dosyas diyebiliriz,
u an ok detaya girmeye gerek duymuyorum.

lk projemiz oluturuldu. imdi birka ayar yaparak ilk testi


yapabiliriz.

Pycharm' balatarak gelen ekrandan Open ile projenizin


klasrn (/django/teknikservisformu/) seiyoruz.

* Alt+F12 ile terminali aabilirsiniz.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
11
[Link] de ufak birka ayar yaparak Trkeletirme yapyoruz.

ctrl+g
Satr: 107-109
# [Link]
LANGUAGE_CODE = 'tr_TR'
TIME_ZONE = 'Europe/Istanbul'

Terminalde;

./[Link] makemigrations && ./[Link] migrate

yazarak deiiklikleri onaylatp, hata olup olmadn kontrol


ediyoruz.

Bonus: 1.8 den sonra syncdb artk tamamen kullanlmyor.

./[Link] runserver
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
12
komutu ile Django'nun basit bir http servern altryoruz.

System check identified no issues (0 silenced).


January 12, 2016 - 13:58:43
Django version 1.9.1, using settings '[Link]'
Starting development server at [Link]
Quit the server with CONTROL-C.

Burada karlalabilecek hatalara deinelim.

Error: That port is already in use.


Eer farkl bir komut satrnda ayn proje ve/veya farkl bir
proje alyorsa bu hatay alrsnz. Yani bu port zaten
kullanlyor.

lla 2 proje altrlmas gerekiyorsa

./[Link] runserver [Link]:8001

ile farkl bir port zerinden altrlabilir.

Dier bir hususta; ip adresi alan baka bir cihazdan ( pc, telefon,
tablet vs.. ) projenizi kontrol etmek isterseniz komut satrnzda ip
adresinizi renerek bu ip zerinden yayn yapabilirsiniz.
Bylelikle farkl tarayclarda nasl gzktne bakabilirsiniz.

muslu@muslu-MS-7641:~/django/teknikservistakibi$ ifconfig

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
13
Dier alnabilecek hatalar;

CommandError: "[Link]" is not a valid port number


or address:port pair.
Port u belirtilmezseniz alacanz hata

Error: You don't have permission to access that port.


Port adresi belirttiiniz halde farkl bir komut satrnda ya
da bir http server ( apache ) ykl ise yani bu port
kullanlyorsa.

Mnasip bir port bulduunuzda deneme yapabilirsiniz.

./[Link] runserver [Link]:8080

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
14
Grdnz gibi Django projemiz almaya balad ve Trke
olarak yaynlanyor.

[Link] dosyamzdan dili deitirip test edebilirsiniz. Neredeyse


bilinen tm dillere destek veriyor.

Alnabilecek dier hata ise:

CommandError: You must set settings.ALLOWED_HOSTS if


DEBUG is False.

Eer DEBUG modundan kmak isterseniz, yani hatalarn apak


ekilde yaynlanmasn istemiyor, zelletirilmi bir html
dosyasnda gsterilmesini istiyorsanz ALLOWED_HOSTS listesine
kabul edilen ip ve adresleri yazmanz gerekir.

rnek:
ALLOWED_HOSTS = ['[Link]', '[Link]', '.[Link]']

www kullanmanz gerektiinde .[Link] eklinde


yazabilirsiniz. leride daha detayl deineceiz.

Deiiklii yaptktan sonra artk bir sayfa gelmeyecek ve Not found


uyars verecektir. nk url olarak herhangi bir ynlendirme
yapmadk.

[Link] ile ilgili birka noktaya daha deinelim ama ihtiya


olduka gerekli eklemeleri yapacaz.
# -*- coding: utf-8 -*-
import os
# Projenin bulunduu klasre ulamak iin deiken
BASE_DIR = [Link]([Link]([Link](__file__)))
# Hatalarn ekrana yanstlmas
DEBUG = True
#allacak domain isimler listesi
ALLOWED_HOSTS = ['[Link]', '[Link]']
# Veritaban seimi, ayarlar
DATABASES = {
'default': {
'ENGINE': '[Link].sqlite3',
'NAME': [Link](BASE_DIR, 'db.sqlite3'),
}
}
#Kurulu uygulamalar. Yazdmz uygulamalarn listesi. ncelik sras var.
INSTALLED_APPS = [
'[Link]',
'[Link]',
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
15
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'servisformu'
]
# Tm projede geerli olacak kodlar. Sralamaya gre ncelik middleware lerdedi.
MIDDLEWARE_CLASSES = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',

'[Link]',

'[Link]',
'[Link]',

'[Link]',
]
# [Link] dosyas
ROOT_URLCONF = '[Link]'
# Html dosyalar iinde gnderilecek veriler, ayarlar vs..
TEMPLATES = [
{
'BACKEND':
'[Link]',
'DIRS': [[Link](BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'[Link].context_processors.debug',
'[Link].context_processors.request',
'[Link].context_processors.auth',

'[Link].context_processors.messages',
],
},
},
]
# Http serverlar iin wsgi dosya ad ve uygulamas
WSGI_APPLICATION = '[Link]'
# Yetkilerde geerli olan ifreleme yntemleri
AUTH_PASSWORD_VALIDATORS = [
{
'NAME':
'[Link].password_validation.UserAttributeSimilarityValidator',
},
{
'NAME':
'[Link].password_validation.MinimumLengthValidator',
},
# {
# 'NAME':
'[Link].password_validation.CommonPasswordValidator',
# },
# {
# 'NAME':
'[Link].password_validation.NumericPasswordValidator',
# },
]
# Uluslararaslama
# [Link]
LANGUAGE_CODE = 'tr_TR'
TIME_ZONE = 'Europe/Istanbul'
USE_I18N = True
USE_L10N = True
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
16
USE_TZ = True
# Statik dosyalar (CSS, JavaScript, Resimler)
# [Link]
MEDIA_ROOT = BASE_DIR + '/media/'
MEDIA_URL = '/media/'
STATIC_ROOT = BASE_DIR + "/static/"
STATIC_URL = '/static/'
# Gizli kod. leride gerekecek.
SECRET_KEY = '9f5$6e&r&x3*_a%j1ocv*p3aftgkl1y5n&)+^jehhc@&z%@@8p'

okunabilirlik iin boluklar ekledim ama bu yazm hali PEP


standartlarna uygun deil zaten Pycharm da bu konuda
uyaracaktr ancak hata olarak deil uyar olarak.

Yazm aamasnda iken Debug modunu True yapmanz gerekir.

Alnacak hata:

SyntaxError: Non-ASCII character '\xc4' in file


/home/muslu/django/teknikservistakibi/teknikservistakibi/[Link]
on line 3, but no encoding declared; see
[Link] for details
Yani diyor ki; [Link] dosyamzn 3. satrnda pep standartlarna
uygun olmayan kodlama sorunu var. ( non-ascii dedii )
Yorum satr olsa bile trke karakter kullanamayz.

# Projenin bulunduu klasre ulamak iin deiken

Bu hata ile sk karlaacaz, bu sebeple her dosyanzn bana #


-*- coding: utf-8 -*- (Bu dosyann kodlama ekli utf-8 dir)
eklemeniz gerekiyor. Her zaman birinci satra eklenmesi gerekir.
Django'nun bir gzel taraf da ynetim panelinin hazr gelmesi.
Kullanclar, gruplar ve bunlarn yetkileri iin auth modul bizim
iin hazrlanm.

INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
]

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
17
Bonus: [Link] aslnda
/usr/local/lib/python2.7/dist-packages/Django-1.9.1-
[Link]/django/contrib/admin/ fiziksel yolundaki dosyalar eklemek
( import ) demek.

[Link] dosyasn atnzda greceiniz gibi admin sayfasna ait


url aktif geliyor.

Test etmek iin taraycnzda [Link]


adresini aabilirsiniz.

Tasarm bozuk geldi, nk static dediimiz dosyalar yklenmedi.

Komut satrndan ( terminal ) kontrol edebiliriz.

[12/Jan/2016 15:47:41] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 1697


[12/Jan/2016 15:47:41] "GET /static/admin/css/[Link] HTTP/1.1" 404 99
[12/Jan/2016 15:47:41] "GET /static/admin/css/[Link] HTTP/1.1" 404 100

admin sayfasndaki statik dosyalarn kendi projemize aktararak


istediimiz gibi dzenleyebiliriz.

Bunun iin; terminalde ctrl+c ile alan komutu durdurup,

python [Link] collectstatic

yazmamz gerekir ama hata alacaz. nk STATIC_ROOT


tanmlamasn yapmadk.

[Link]: You're using the


staticfiles app without having set the STATIC_ROOT setting to a
filesystem path.

Yani; STATIC_URL istei ile gelen linkin fiziksel karln


yazmalyz. /static/ olarak gelecek soruya, cevap olarak proje
klasrmzn altndaki static klasrnn ( dizin demeyi pek tercih
etmiyorum ) fiziksel yolunu vermek.
[Link] dosyamzda aadaki tanmlamalar yapyoruz.

STATIC_ROOT = BASE_DIR + "/static/"

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
18
STATIC_URL = '/static/'

ek olarak projemizin medya dosyalar iin ayr bir klasr


oluturarak admin statik dosyalarndan ayrmamz daha iyi olacak.
# Statik dosyalar (CSS, JavaScript, Resimler)
# [Link]
MEDIA_ROOT = BASE_DIR + '/media/'
MEDIA_URL = '/media/'

URL = Fiziksel yol


[Link] = /home/muslu/django/teknikservisformu/static/
[Link] = /home/muslu/django/teknikservisformu/media/css/[Link]

terminalden ya da dosya yneticisi ile static ve media adnda


klasrlerimizi oluturalm.

* static klasrn oluturmasanz bile collectstatic komutu oluturacak.

mkdir static
mkdir media

Tekrar collecstatic ile statik dosyalar projemize kopyalabiliriz.

python [Link] collectstatic

Uyar olarak /home/muslu/django/teknikservistakibi/static


klasrne kopyalanacak ne dersiniz diye soruyor.

yes

ls static/
diyerek ya da proje klasrmzdeki static klasrne bakarak
admin klasrnn oluup olumadn kontrol edebiliriz.

./[Link] runserver [Link]:8080

ile tekrar projemizin yaynn balatalm ve taraycda


[Link] sekmemizi yenileyelim.
Alnabilecek hata:

Bad Request (400)


Debug modu hala False!

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
19
Statik dosyalar hala 404 veriyor.
Debug modu hala False.

Herhangi bir sorun yaamadnz ise aadaki gibi ynetim paneli


gelecek.

Ynetim paneline giri yapabilmemiz iin super yetkili bir kullanc


oluturmalyz.

Daha sonra super olmasa da yetkili kiilerin girmesi iin panelden


kullanc oluturacaz.

Bonus: Django 1.8 ncesinde syncdb ile yetkili kullancda


oluturabiliyorduk ama artk komut ile oluturmamz gerekiyor.

Terminalde ctrl+c ile yayn durdurup

./[Link] createsuperuser

komutu ile super kullanc oluturabiliriz.

Sorulara cevap verdikten sonra yetkili kullanc oluturabilirsiniz.


Bu komutu unutmayn ileride ifreyi unutursanz bavuracaksnz.

Alnabilecek hatalar:
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
20
This password is too short. It must contain at least 8 characters.
This password is entirely numeric.
ifreniz ok ksa. En az 8 karakter olmas gerekiyor.

This password is too common.


Klasik bir ifre seimi yapld.

The password is too similar to the email address.


Email adresi ile benzer ifre seildi.

Error: Your passwords didn't match.


Yazlan bilgiler ayn deil.

Bu parola dorulama ve oluturma seenekleri 1.9 ile geldi.

[Link]

[Link] de ki AUTH_PASSWORD_VALIDATORS listesinden


istediiniz ( istemediiniz ) kontrol ekillerini kaldrabilirsiniz.

# Yetkilerde geerli olan ifreleme yntemleri


AUTH_PASSWORD_VALIDATORS = [
{
'NAME':
'[Link].password_validation.UserAttributeSimilarityValidator',
},
{
'NAME':
'[Link].password_validation.MinimumLengthValidator',
},
# {
# 'NAME':
'[Link].password_validation.CommonPasswordValidator',
# },
# {
# 'NAME':
'[Link].password_validation.NumericPasswordValidator',
# },
]

Uygun bir ifre setikten sonra

Superuser created successfully.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
21
Bilgisini alacaz.

[Link]

Ynetim panelimiz ald.

YNETM PANELN DETRME

Django'nun kendine has ynetim paneli temasn aslnda


beenmiyorum, ileri de suit panelinin kurulum ve kullanlmasna
deineceim.

sudo pip install django-suit

nce admin paneli temasn nasl deitiririz konusuna bakalm.

Django'nun admin panel dosyalarn kendi projemizdeki templates


klasrne tadmzda (statik dosyalar gibi) istediimiz gibi
dzenleme yapabiliriz.

Proje klasrmzde templates adnda bir klasr oluturalm.

Bu klasrde html, txt ve xml dosyalarmz saklayacaz.


[Link], [Link], [Link], vs..

Bu templates klasrmzn Django tarafndan geerli olmas iin


de [Link] dosyamzda dzenleme yapmamz gerekiyor.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
22
Templates ayar listemizdeki DIRS deikenini proje klasrmzn
altndaki templates klasr olarak gncelliyoruz.

# Html dosyalar iinde gnderilecek veriler, ayarlar vs..


TEMPLATES = [
{
'BACKEND':
'[Link]',
'DIRS': [[Link](BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'[Link].context_processors.debug',
'[Link].context_processors.request',
'[Link].context_processors.auth',

'[Link].context_processors.messages',
],
},
},
]

imdi Django'nun kurulduu klasr yolunu bulalm.

Terminal aarak aadaki komutu yazn.

Linux, Mac OS, Windows:

python -c "import django; print(django.__path__)"

Bonus: python -c ...... ile python kodlarn altrabilirsiniz.


Bonus: ... ; ...... ile tek satrda kod yazabilirsiniz.

Windows:

C:\Python27\lib\site-packages\django\contrib\admin\templates\

Dosya yneticiniz ile bu klasr aarak admin klasrn proje


klasrnzdeki templates klasrn kopyalamanz yeterli.

Linux, Mac OS:

['/usr/local/lib/python2.7/dist-packages/[Link]/django']

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
23
sterseniz dosya yneticiniz ile kopyalamay yapabilirsiniz.

/usr/local/lib/python2.7/dist-packages/Django-1.9.1-
[Link]/django/contrib/admin/templates/admin

klasrn proje klasrnzn altnda oluturduunuz templates


klasrne kopyalayabilir
ya da terminalde;

cd ~/django/teknikservistakibi/templates

komutu ile proje klasrmzdeki templates klasrne geiyoruz.

cp -a /usr/local/lib/python2.7/dist-packages/Django-1.9.1-
[Link]/django/contrib/admin/templates/admin/. .

Dikkat: 2 adet nokta var. Birisi admin/ klasrnn altndaki tm


dosyalar demek, dieri bulunduumuz klasr demek.

Hata almaktan ekiniyor ya da anlalamadysa alttaki komutlar


kullanabilirsiniz.

cd /usr/local/lib/python2.7/dist-packages/Django-1.9.1-
[Link]/django/contrib/admin/templates/
cp -a admin/ ~/django/teknikservistakibi/templates/
cd ~/django/teknikservistakibi/templates/

cd ile djangonun admin templates klasrne gittik


cp -a ile admin ve alt klasrlerini proje klasrmzdeki templates
klasrmze kopyaladk.
cd ile tekrar proje klasrmzdeki templates klasrmze dndk.

ls, tree veya dosya yneticiniz ile kopyala yaplp yaplmadn


kontrol edebilirsiniz.

Kopyalamay tamamladktan sonra deneme yapabiliriz.

Pycharm da templates admin [Link] ve base_site.html


dosyalarn aalm ve title etiketlerini deitirelim.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
24
./[Link] runserver

[Link]

taraycnzn st ksmna baktmzda ya da kaynak kodlar kontrol


ettiimizde deiikliklerin altn greceiz.

Bundan sonra istediiniz gibi deiiklikleri yapabilirsiniz. leri


seviyelerde debug_tool kullanarak yaynlanan sayfalar grerek
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
25
hangi sayfalar deitirmemiz gerektiini de reneceiz.

Bonus: Pycharm'da ctrl tuuna basl tutarken bir fonksiyon,


script yolu, stil class vs.. tkladnzda dosya yolu gsterir ya da
direk fonksiyonun bulunduu dosyaya gtrr.

[Link] metni zerinde ctrl tuuna basl tutarak fare sol tuu ile
tkladnzda aadaki gibi yollar gsterecektir ve hangisi
tklarsanz o dosyay aacaktr.

Burada grld gibi bu stil dosyas 2 yerde mevcut.

collectstatic komutu ile statik dosyalarn static klasrmze


kopyalamtk.

Biz static klasrmzdekileri kullanmak istiyoruz ancak bu konuya


daha sonra Apache ile deineceiz. Ynetim paneline ait html
dosyalar deitirmeniz yeterli.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
26
imdi ksaca hazr gelen kimlik dorulama ve yetkilendirme
uygulamalarna bakp bir uygulama yazmaya balayalm.

Gruplar --> Ekle linki ile grup ekleme sayfasn ayoruz. Grup
adnn altnda ManyToMany ile ekilmi verileri gryoruz. Burada
tm uygulama yetkileri mevcut. Yazacamz uygulamalarda
burada gzkecek.

rnek olarak finans, teknik servis, kargo, sat vs.. gibi gruplar
oluturulup kiilere ekleme, silme ve/veya dzenleme yetkileri
toplu olarak verilebilir.

Kullanc Ekleme:

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
27
Bu ekranda kullanc iin ad ve parola girildikten sonra detayl
bilgilerin gelecei bir sayfa gelecek.

Artk bir uygulama yazmaya balayalm.

Terminalde proje klasrnze geerek

./[Link] startapp servisformu


python [Link] startapp servisformu
django-admin startapp servisformu

herhangi birini yazarak uygulamay balatabilirsiniz.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
28
Alnabilecek hatalar:

CommandError: '/home/muslu/django/teknikservistakibi/servisformu'
already exists
Uygulama zaten oluturulmu, farkl bir isim seilmeli.

CommandError: 'django' conflicts with the name of an existing Python


module and cannot be used as an app name. Please try another name.
Python modl isimleri uygulama ad olarak kullanlamaz. rnein;
django, math

lk uygulamann oluturulmasyla proje klasrmzde


uygulamamzn ad ile bir klasr daha oluturuldu.

servisformu klasrnde aadaki dosya ve klasrler oluturuldu.

[Link]: Uygulamann admin sayfasna ait ayarlarn yaplaca dosya.


[Link] den gelen alanlar tanmlayp, filtreleyip, kstlayabiliriz.

[Link]: Uygulamann ad ve dier ayarlarnn yaplaca dosya

__init__.py: Klasik python dosyas, zaten deinmitik.

migrations: Veritabanna ait gncellemelerin ve deiikliklerin kolay kullanm


iin tutulaca klasr

[Link]: Veritabannda oluturacamz tablo ve alanlar yazacacamz dosya.


Herhangi bir sql bilginiz olmasa bile kolayca ynetebileceiz
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
29
[Link]: Uygulamann baz testleri deneyebileceimiz dosya

[Link]: Veritabanndan gelen bilgilerin ya da kendi tanmladmz deiken


ya da verilerin html, txt ya da xml dosyalarna ynlendirilecei dosya. Ayrca
sadece ekrana bilgi de bastrabiliriz.

Url den gelen sorgularn srayla ilerlemesini yle anlayabiliriz.

Taraycya yazlan url nce middleware da denetlenir. Bu konuda u


an uzun durmayacaz. Daha sonra [Link] ye eklediimiz url
ynlendirmesi ile [Link] ye, burada da [Link] den gelen
veriler tekrar templates klasrndeki dosyalara ynlendirebiliriz.

Aklnzn karmamas iin grafiksel anlatmak daha doru olacaktr.

Basit ekilde yle sralanabilir.


[Link] --> [Link] --> [Link] --> [Link] ---> html

[Link] --> def formlar(request) --> class


FormBilgileri([Link]) --> def formlar(request) -->
[Link]

Aklama olarakta yle olabilir.

Taraycdan gelen link [Link] de hangi fonksiyona tanmland ise


buradan da [Link] de tanmlanan tablodanki alanlar alnp
render edilerek html dosyasna gnderilir.

Hemen bir rnek yazarak anlalr hale getirelim.

Pycharm da teknikservis klasrnden [Link] yi aalm ve


aadaki gibi kodlar ekleyelim.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
30
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from [Link] import timezone
from [Link] import models

class Teknisyen ( [Link] ) :


### Teknisyen adnda bir tablo oluturuyoruz.
Aktif = [Link](default = 1)
### Teknisyenin aktif olup olmadn semek iin booleanfield kullanacaz. Default
olarakta seili gelecek.

AdSoyad = [Link] ( u'Ad Soyad', max_length =


250 )
### Tekniksyenin ad ve soya dn gireceimiz en fazla 250 karakterlik bir varchar
alan. 255 karaktere kadar yazlabilir.

KayitTarihi = [Link] ( u"Kayt Tarihi",


default=[Link])
### kayt ilemi yapldnda otomatik bugn seecek ve gzkmeyecek.

def __unicode__(self):
### daha nceden __str__ kullanlyordu. Models arldnda burada seilen alan
ve/veya alanlar dndrlr. Birazdan greceiz.

return [Link]

class Meta:
### admin sayfasnda bu uygulamann nasl isimlendirilip arlaca tanmlamalar
verbose_name_plural = u"Teknisyenler"
verbose_name = u"Teknisyen"

** kafa kartrmamak iin from __future__ import unicode_literals


kodlamalarna u an deinmiyoruz.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
31
[Link] dosyasn ap aadaki gibi eklemeleri yapalm.

# -*- coding: utf-8 -*-


from [Link] import admin
from [Link] import Teknisyen
### [Link] dosyamzdaki Teknisyen ( class - snf ) tablomuzu ve alanlar ekliyoruz.

class TeknisyenAdmin([Link]):
### Admin sayfasnda gsterilecek detaylar

list_display = ('Aktif', 'AdSoyad')


### srayla gsterilecek alanlar

list_per_page = 20
### sayfadaki kayt adeti, otomatik sayfalama yapacak

exclude = ( 'KayitTarihi', )
### KayitTarihi alann gizliyoruz

[Link](Teknisyen, TeknisyenAdmin)
### Teknisyen ve TeknisyenAdmin snflarn kayt ettiriyoruz.

Artk uygulamamz projemize dahil edebiliriz.


[Link] dosyamza eklememizi yapalm.
INSTALLED_APPS = [
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'servisformu'
]

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
32
Bonus: pep standartlarn geici olarak pasif etmek isterseniz,
ctrl+shift+a ile arama ekrann ap pep yazabilir ve ON olan ksmlar
OFF yapabilirsiniz.

Terminalde;

./[Link] makemigrations servisformu && ./[Link] migrate &&


./[Link] runserver

yazarak yaptmz deiiklikleri ekleyip, onaylatp servermz


altryoruz.

[Link]

Uygulamamz ynetim sayfamzda artk hazr.

Veri ekleyip html dosyasna gnderilmeden nce ynetim


sayfasnda yapabileceimiz deiikliklere bakalm.
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
33
[Link] deki
verbose_name_plural = u"Teknisyenler"

tanmlamamz deitirerek deneme yapalm.

verbose_name = u"Teknisyen"

tanmlamasn deitirerek test edebiliriz.

Deiiklikleri geri alarak kayt girildikten sonra tm listeyi kontrol


edelim.

Teknisyen "Muslu YKSEKTEPE" baarl olarak eklendi.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
34
Bilgisini geldii yer __unicode__ da eklediimiz alann geri dn
Grid sistemindeki gelen bilgiler ise list_display de eklediimiz
alanlar ve sralamas ile olumakta.

Bu gird sistemi djangonun kendi oluturduu alandr ve klasik


olarak tm uygulamalarda kullanlmaktadr.

Hemen buraya kendi alanmz ekleyelim.

[Link] de class iine aadaki gibi bir fonksiyon oluturalm

def Yazdir ( self ) :


return '<a href="/yazdir/%s" target="_blank">Yazdr</a>' % [Link]
### Fonksiyon arldnda dndrlecek metin.

Yazdir.short_description = u'Yazdr'
### Fonksiyonun ksa aklamas

Yazdir.allow_tags = True
### Fonksiyonumuz html etiket ieriyor

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
35
[Link] deki list_display oluturduumuz fonksiyon adn
ekleyelim.
class TeknisyenAdmin([Link]):

list_display = ['Aktif', 'AdSoyad', 'Yazdir']

[Link]

Bir alan daha ekleyelim.

def EkAlanTest(self):
return [Link](' ', '_______')
EkAlanTest.short_description = u'Buras alann bal'

class TeknisyenAdmin([Link]):

list_display = ['Aktif', 'AdSoyad', 'Yazdir', 'EkAlanTest']

Alnabilecek hatalar:

<class '[Link]'>: (admin.E116) The value


of 'list_filter[2]' refers to 'Yazdir', which does not refer to a
Field.

TeknisyenAdmin'deki list_filter deiken listesindeki 3. deiken


geerli bir field alan deil.

Yani Yazdir fonksiyonu zel bir tanmlama olduu iin list_filter da


kullanlamaz.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
36
Kaytlara daha kolay ulamak ve filtreleme yapmak iin Django'nun
hazr birka fonksiyonlarna daha bakalm...

list_filter = ['Aktif', 'AdSoyad', ]


### Filtre ( szge ) yapabilmemiz iin hazr sorgu alan
search_fields = ['AdSoyad', ]
### Arama yapabilmemiz iin otomatik bir metin alan oluturur. Arayacamz kelimeler AdSoyad'a
girdiimiz kaytlarda sorgulayacak.
date_hierarchy = 'KayitTarihi'
### Kaytlar yl, ay ve gn olarak otomatik filtreleme yaptrmak iin gird stnde listeleme
yapar

imdi de kayt girerken yapabileceimiz otomatik


yetkilendirmelere bakalm

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
37
Kayt Ekleme yetki fonksiyonu
def has_add_permission(self, request):
return False

eklendiinde szge stndeki butonun artk gelmediini


greceksiniz.

Yani artk yeni kayt ekleme yetkimiz yok. Bu tm kullanclar iin


geerlidir. Bazen tek bir kayt olmas ve bu kaydn sadece
gncellenmesi gerektiinde bu yntemi kullanabilirsiniz. u an
aklma gelen bir rnek hakkmzda yazs olabilir. Mteriniz artk
hakkmzda yazs ekleyemez sadece dzenleyebilir ve silebilir.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
38
def has_delete_permission(self, request, obj=None):

return False

Fonksiyonunu ekleyerek artk bu uygulama iin silme yetkisini de


iptal etmi olduk.

Tm kullanclar deilde baz kullanclar engellemek istersek,


grup, yelik, super kullanc ya da sadece kayd giren kiinin bu
yetkilerin dnda ya da iinde kalmas iin fonksiyona birka
mdahale etmemiz gerekiyor.

Aadaki kodlar herhangi bir fonksiyonu ekleyerek istediimiz


gibi yetkilendirme yapabiliriz ama ben has_add_permission iin
anlatacam.
Fonksiyonlara request otomatik gnderildii iin u an da hangi
kullanc var renebiliyoruz.

if not [Link].is_superuser:
### kullanc super inek deilse
try:
KayitSayisi = [Link]()
### hi kayt olmadnda hata verecektir.

except:
KayitSayisi = 0
### geerli uygulamadaki obje says, yani toplam kayt says

KalanLimit = 5
### super olmayan kullanclar kayt says en fazla 5 olabilir.

### KalanLimit = [Link](user = [Link]).KayitLimiti


### fikir olmas asndan ekledim. leri de kullanclara kayt limiti verebiliriz. [Link]
daki gibi
if KayitSayisi >= KalanLimit:
return False
else:
return True

***return True olduu srece fonksiyon alacaktr.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
39
Limit saysn 2 yaparak deneme yapabilirsiniz ama ilk koulu
unutmayn. Yani ya super kullanc olmayan bir kullanc ile giri
yapn ya da if not [Link].is_superuser: satrn pasif edin.

2 kayt girdikten sonra yeni kayt butonu pasif oldu. Eer kayd biri
silinirse tekrar aktif olacak.

Ynetim sayfasnda yetkilendirme ve kstlama ilemleri de bu


ekilde yaplabilir.

Eer sonularn gsterildii bu sayfa da stil deiiklii yapmak


isterseniz proje klasrnzdeki
templates/admin/change_list_results.html dosyasn kullanabilirsiniz.

rnek stil:
<style>
.object-tools [Link] {
font-size: 22px;
background-color: #ff9900;
}
</style>
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
40
Yine ayn dosya da bulunan sonu saysn yazdrabiliriz.
{% if results %}
<div class="results">
<p>{{ results|length }} adet kayt bulundu!</p>

<table id="result_list">

imdi de kullancya gre gsterilecek alanlar kstlamay grelim.

list_display'i liste olarak tanmlayarak remove ile kullancya gre


gizle/gster yapabiliriz.
class TeknisyenAdmin([Link]):

list_display = ['Aktif', 'AdSoyad', 'Yazdir', 'EkAlanTest']

olarak deitirelim.
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
41
def get_list_display(self, request):
g_l = super(TeknisyenAdmin, self).get_list_display(request)
### list_display listesini g_l adnda bir listeye aktaryoruz.

Try:
## kullanc tekrar sayfay yklediinde silinen alan yeniden silinmeye allacak ve hata
oluacak

if not [Link].is_superuser:
### kullanc super kullanc deilse

g_l.remove('EkAlanTest')
### list_diplay listemizden EkAlanTest alann gizle

except:
### hata olutuunda pas ge
pass

return g_l
### g_l listesi dzenlenmi olarak ya da normal hali ile geri gnderilsin.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
42
Alnabilecek hatalar:

'tuple' object has no attribute 'remove'


tuple olarak tanmlanan list_display'i listeye evirmeyi atladnz,
yani ['Aktif', 'AdSoyad'......] gibi olmal

[Link](x): x not in list


Kullanc sayfay tekrar yklemeye altnda listeden EkAlanTest
alann tekrar silmeye alyor ama yok. try except kullanmay
unuttunuz.

Bu fonksiyonlar tm yetkileri kstlayabilirsiniz.

imdi de uygulamann ynetim panelindeki isimlendirmesine


bakalm.

Uygulamamzn ad servisformu olduu iin uygulama iin


oluturulan div de SERVISFORMU olarak isimlendirildi. stersek
buray deitirebiliriz.

Bunun iin __init__.py ve [Link] dosyalarmz aalm.

[Link]:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from [Link] import AppConfig
class ServisformuConfig(AppConfig):
name = 'servisformu'
verbose_name = u'Servis Formlar'
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
43
__init__.py:
default_app_config = '[Link]'

[Link]

Uygulama admz deiti.

Projemizin konusuna geri dnersek bir teknik servis i takibi iin


formlar oluturacaz. Bunun iin nce projenin neleri kapsayaca
ve nelere sorun zeceini dnerek n bir fizibilete yapalm.

kts alnacak form iin hangi alanlar olmas gerektiini


dnelim.

1. Mteri bilgileri
2. rnler (tablet, laptop, otomobil, telefon vss.)
3. rnler ile gelen aksesuarlar (pil, anta vs..)
4. Teknisyen (Mdahale edecek personel)
5. lem durumlar (Hazr, yeni geldi, para bekliyor vs..)

Projemizde nden kurgulamamz gereken hususlarda ok dikkatli


olmalyz. Daha sonradan eklenmesi gereken alan ya da
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
44
uygulamalar, veritabannda bilgi kaybna kadar yol aabilir.
Teknisyenler iin bir tablo oluturmutuk. imdi de mteriler iin
bir tablo oluturalm. Bunu yeni bir uygulama oluturarak
yapabiliriz ancak ben ayn model zerinden yeni bir snfla devam
etmenin daha uygun olduunu dnyorum.

Fazla uygulama ile yeni balayan arkadalarn kafalar karmasn


istemeyiz.

[Link] dosyamz ap alt tarafa yazmaya balayalm.

[Link]:
import random, string
class Musteriler ( [Link] ) :
Aktif = [Link](default = 1)
Kodu = [Link] ( u'Mteri Kodu',
default=''.join([Link]([Link]) for x in range(8)), max_length = 8 )
Unvan = [Link] ( u'Ticari nvan', max_length = 250 )
Yetkili = [Link] ( u'Yetkili Ad Soyad', max_length = 250 )
Telefon = [Link] ( u'Telefon', max_length = 13)
KayitTarihi = [Link] ( u"Kayt Tarihi", default=[Link])
def __unicode__(self):
# return [Link] + " " + [Link]
return "Mteri Kodu: %s - Ad: %s" % ([Link], [Link])
class Meta:
verbose_name_plural = u"Mteriler"
verbose_name = u"Mteri"

Bu snfta farkl olarak kullandmz ey mteri koduna ait


rastgele bir kod oluturmak. Yeni bir kayt atmzda default
olarak srekli rastgele 8 haneli sadece rakamlardan oluan bir kod
oluturulacak.
default=''.join([Link]([Link]) for x in range(8))

terminalde

./[Link] makemigrations servisformu && ./[Link] migrate && ./[Link] runserver

ile deiiklikleri onaylatp server balatyoruz.

[Link] dosyasn aarak


class MusterilerAdmin([Link]):
list_display = ( 'Kodu', 'Unvan', 'Yetkili', 'Aktif')
list_per_page = 80
exclude = ( 'KayitTarihi', )
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
45
search_fields = ( 'Yetkili', 'Unvan' )
[Link](MusterilerAdmin, Musteriler)

Alnacak hata:
TypeError: 'MediaDefiningClass' object is not iterable

nk register ederken nce snf, sonra snfa ait admin ayarlar


snf tanmlanmal.

Bu hata ile ok nadir karlacaksnz ama aklma gelmiken


deinmek istedim.

[Link](Musteriler, MusterilerAdmin)

olarak dzeltelim.
./[Link] makemigrations servisformu && ./[Link] migrate && ./[Link] runserver

ve

[Link]

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
46
Mteri kodu otomatik 8 karakter ve sadece rakamlardan oluuyor.

Labellarda grdnz gibi tm alanlar zorunlu. nk charfield


oluturuken blank=True kullanmadk.

[Link] ye dnelim ve bir test daha yapalm.

Telefon alanmza blank = True ekleyelim.

Telefon = [Link] ( u'Telefon', max_length = 13, blank = True )

Artk telefon alan zorunlu deil.

Bonus: Gerektiinde bir alan null kabul edilmiyor istersenirse null


= True yazabilirsiniz.

NOT: Kayt dzenleme linki her zaman iin satrn ilk alanndadr.
Burada mteri kodu.

Satrdaki tm alanlarda ya da seilen alanlar tklandnda


Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
47
dzenleme linkinin getirilmesi iin [Link] dosyamz ap
list_display_links ekleyebiliriz.
class MusterilerAdmin([Link]):
list_display = ( 'Kodu', 'Unvan', 'Yetkili', 'Aktif')
list_per_page = 80
exclude = ( 'KayitTarihi', )
search_fields = ( 'Yetkili', 'Unvan' )
list_display_links = ('Unvan', 'Yetkili')

Kaytlarda toplu ilem yaptrmak iin action lar kullanrz. Trke


karl eylem olarak kullanlm ve bir alr kutuda sunulmu.
stersek bunlara kendimize zel toplu ilem eylemleri ekleyebiliriz.

[Link] dosyamz aalm ve en stlerden bir yer beenip


aadaki fonksiyonu ekleyelim.

[Link]:
from [Link] import Musteriler
def SecilileriGuncelle(modeladmin, request, queryset):
for k in queryset:
[Link]()
return ""
SecilileriGuncelle.short_description = u"Seilileri Gncelle"
class MusterilerAdmin([Link]):
list_display = ( 'Kodu', 'Unvan', 'Yetkili', 'Aktif')
list_per_page = 80
exclude = ( 'KayitTarihi', )
search_fields = ( 'Yetkili', 'Unvan' )
list_display_links = ('Unvan', 'Yetkili')
actions = (SecilileriGuncelle,)
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
48
actions_on_bottom = True
actions_on_top = True

Bonus: actions_on_bottom ve actions_on_top ile


eylemler alr kutusunu kayt gridlerinin altnda ya da stnde
gster diyebiliriz.

Alnabilecek hatalar:

NameError: name 'SecilileriGuncelle' is not defined


SecilileriGuncelle fonksiyonunu altta braktnz ya da
yazmadnz.

Biraz daha detayl inceleyelim.


[Link]:
def SecilileriGuncelle(modeladmin, request, queryset):
### SecilileriGuncelle adnda bir fonksiyon uluturuyoruz
print queryset
### querysetten neler geldiine bakyoruz
for k in queryset:
### queryset ile seilen tm kaytlarn listelerini alyoruz.
print k
### kaytlar dngden tek tek alyoruz
[Link]()
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
49
### snfmza ait save modln altryoruz. Birazdan detayl deineceim.
return ""
### geri dn ama bo dn
SecilileriGuncelle.short_description = u"Seilileri Gncelle"
1 kayt var.

2 kayt var.

Hatrlarsanz __unicode__ fonksiyonuna sadece yetkili alanmz


eklemitik.

[Link]:
def __unicode__(self):
return [Link]

yerine

[Link]:
def __unicode__(self):
# return [Link] + " " + [Link]
# return "%s %s" % ([Link], [Link])
return "Mteri Kodu: %s - Ad: %s" % ([Link], [Link])

Deitirip ktlar tekrar kontrol edelim.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
50
Alnabilecek hatalar:
coercing to Unicode: need string or buffer, [Link] found

dnlerin mutlaka string olarak gnderilmesi gerekir. Burada


datetimefield kullanlan bir alan direk gndermeye alyoruz.

Hazr gncelleme yaparken seilen kaytlarda deiim yaparak


kayt edilmesine bakalm.

[Link] dosyamz tekrar ap

[Link]:
def SecilileriGuncelle(modeladmin, request, queryset):
for k in queryset:
[Link] = [Link] + "____"
[Link]()
return ""
SecilileriGuncelle.short_description = u"Seilileri Gncelle"

olarak deitirip kayt edelim ve test edelim.

stediiniz kaytlar seip eylemlerden Seilileri Gncelle 'yi seip


git diyelim.

Yetkili ad soyad alanlarndaki kaytlarn sonuna ___ eklendi.

Buraya da zel bir alan ekleyerek mterilerin telefon numaralarn


aratabiliriz. Bunu iin [Link] kullanacaz yani bilgisayarnzda
arama yapan bir uygulamaya ya da sanal santraliniz varsa bir apiye
ihtiyacnz olacak.

[Link]:
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
51
class MusterilerAdmin([Link]):

list_display = ( 'Kodu', 'Unvan', 'Yetkili', 'Aktif', 'AramaYap')

..

[Link]:
class Musteriler ( [Link] ) :
..
def AramaYap ( self ) :
if [Link]:
return '<a href="[Link] target="_blank">Numaray Ara</a>' % [Link]
else:
return 'Telefon No kayt edilmedi'
AramaYap.short_description = u'Ara'
AramaYap.allow_tags = True

olarak deitirelim.

Gncelleme yaparken sql karln da grmek isterseniz.

[Link]:
def SecilileriGuncelle(modeladmin, request, queryset):
print [Link]
for k in queryset:
[Link] = [Link] + "____"
[Link]()
return ""
SecilileriGuncelle.short_description = u"Seilileri Gncelle"

olarak fonksiyonu gncelleyip terminal ktlarna bakabiliriz.

imdide baz koullar salayan kaytlarda toplu gncelleme


yapalm.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
52
[Link]:
def SecilileriGuncelle(modeladmin, request, queryset):
print [Link]
for k in queryset:
if [Link]("Muslu"):
[Link] = [Link] + u"___Musluilebalyordu"
[Link]()
return ""
SecilileriGuncelle.short_description = u"Seilileri Gncelle"

Sizde super kullanc ise ve telefon numaralarnn bana 0


eklenmediyse 0 ekleyerek yeniden kaydet olarak deneme
yapabilirsiniz.

Alnabilecek hatalar:
'ascii' codec can't decode byte 0xc5 in position 13: ordinal not in
range(128)

Trke karakter kullandysanz ama utf-8 kullanmanz gerekiyorsa bu


hatay alrsnz. rnek olarak "___Musluilebalyordu" bana u....
eklenmediyse bu hata alnr.

Sanrm zel alan ekleyip ilem yaptrma daha iyi anlalmtr.

Bu ekilde birok zellik ve gzellik ekleyebilirsiniz.

Teknisyen ve mterilerin kaytlarn yapabildiimize gre artk


dier gereksinimleri yazabiliriz.

Alnan rnn hangi durumda olduunu kayt edip, her ilemde


gncelleyip ve sorguda gstermek iin durumlar hazrlamamz
gerekiyor.

Sabit durumlar kullanlacak ise charfield e choices ekleyerek bir


listeden seim yaptrabiliriz ama biz siteyi kullanacak kiilerin
kendi durumlarn ekleyebilmeleri iin yeni bir tablo oluturacaz.
[Link] dosyamz aalm ve Durumlar adnda bir snf
oluturalm

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
53
[Link]:
class Durumlar ([Link] ):
Durumu = [Link](u'Durum', max_length=30, help_text='Metin
alannn altnda kayt girerken yardmc olabilecek konular anlatan ksa bir aklama
yazabilirsiniz.')
def __unicode__(self):
return [Link]
class Meta:
verbose_name_plural = u"Durumlar"
verbose_name = u"Durum"

help_text kullanmna dikkat edin.

[Link]:
class DurumlarAdmin([Link]):
list_display = ('Durumu',)
list_per_page = 80
[Link](Durumlar, DurumlarAdmin)

Terminalde;
./[Link] makemigrations servisformu && ./[Link] migrate && ./[Link] runserver

Bonus: Yukardaki Giri Servis Formlar Durumlar Ekle


Durum yazs kafanza takld ve Durum Ekle olarak deitirmek isterseniz
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
54
( tm kaytlarda geerli olacak ) template/admin/change_form.html
dosyasn an, ctrl+g 21 ( farkl satr olabilir ) yazarak if add koulunu
bulunup aadaki gibi deitirin.

{% trans 'Add' %} etiketini yer deitirin. Translate konusuna sonra gireceiz.

&rsaquo; {% if add %} {{ opts.verbose_name }} {% trans 'Add' %} {% else %}


{{ original|truncatewords:"18" }} {% endif %}

Servise braklan rnlerin durumlarn da ayarladmza gre


rnle beraber braklan aksesuarlarda kayt altna alalm.

[Link]:
class Aksesuarlar ([Link] ):
Adi = [Link](u'Adi', max_length=30, help_text='rnle beraber
getirilen tm aksesuarlar. rn: Batarya, anta' )
def __unicode__(self):
return [Link]
class Meta:
verbose_name_plural = u"Aksesuarlar"
verbose_name = u"Aksesuar"

[Link]:
class AksesuarlarAdmin([Link]):
list_display = ('Adi',)
list_per_page = 5
[Link](Aksesuarlar, AksesuarlarAdmin)

./[Link] makemigrations servisformu && ./[Link] migrate && ./[Link] runserver

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
55
Aksesurlar da eklediimize gre artk servis formumuzu
oluturabiliriz. Her forma bir rn eklenecekse nce rn snfn
hazrlamamz gerekiyor ama bir form da getirilen tm rnlerin
kayd tutulmas istenirse nce formu hazrlamalyz ki inline ile
rnleri snrsz kayt ettirebilelim. Kafanz karmasn hemen
yazmaya balyoruz.

[Link]:
class ServisForm ( [Link] ) :
Musteri = [Link] ( Musteriler )
TeslimEden = [Link] ( u'Teslim Eden', max_length = 130 )
TeslimAlan = [Link] ( Teknisyen,
default=int([Link](id=1).id) )
FormNo = [Link] ( u'Form No',
default=''.join([Link]([Link]) for x in range(8)), max_length = 8 )
KayitTarihi = [Link] ( u"Kayt Tarihi", default=[Link])
def __unicode__(self):
return [Link]
class Meta:
verbose_name_plural = u"Formlar"
verbose_name = u"Servis Formu"
def Yazdir ( self ) :
return '<a href="/yazdir/%s" target="_blank">Yazdr</a>' % [Link]
Yazdir.short_description = u'Yazdr'
Yazdir.allow_tags = True

Not: ForeignKey ile baka bir tabloya indexleme yaptryoruz. NoSQL


kullanacamz zaman bunu kullanamayz.
TeslimAlan alanna default olarak teknisyen tablosundaki ilk kayd
getirteceiz.

Alnabilecek hatalar:
This query requires pytz, but it isn't installed.

zm: terminalde sudo pip install pytz

[Link]:
class ServisFormAdmin([Link]):
list_display = ( 'FormNo', 'Musteri', 'TeslimEden', 'TeslimAlan',
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
56
'KayitTarihi', 'Yazdir' )
list_per_page = 50
ordering = ( '-KayitTarihi', )
date_hierarchy = 'KayitTarihi'
search_fields = ( 'FormNo', 'Musteri__Yetkili', 'Musteri__Telefon' )
exclude = ( 'KayitTarihi', )
[Link](ServisForm, ServisFormAdmin)

search_fields tanmlamasna dikkat ettiyseniz __ kullandk. Bu Musteri


tablosundaki Yetkili ve Telefon alanlarnda da ara demek.

./[Link] makemigrations servisformu && ./[Link] migrate && ./[Link] runserver

Yeni kayt oluturmayn. rnleri ekledikten sonra oluturacaz.

Hatrlarsanz mterilere ve teslim alan personel iin aktif


kstlamas eklemitik. Bu kstlamay kullanmak iin [Link]
dosyamz aalm.

[Link]:
class ServisFormAdmin([Link]):
list_display = ( 'FormNo', 'Musteri', 'TeslimEden', 'TeslimAlan',
'KayitTarihi', 'Yazdir' )
list_per_page = 50
ordering = ( '-KayitTarihi', )
date_hierarchy = 'KayitTarihi'
search_fields = ( 'FormNo', 'Musteri__Yetkili', 'Musteri__Telefon' )
exclude = ( 'KayitTarihi', )

def formfield_for_foreignkey(self, db_field, request, **kwargs):

if db_field.name == 'TeslimAlan':
### field ( alan ) ad TeslimAlan ise

kwargs["queryset"] = [Link](Aktif=True)
### Teknisyenlerin sadece aktif olanlar filtreleyerek getir ve queryset e ekle
### kwargs konusuna imdilik girmiyoruz

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
57
if db_field.name == 'Musteri':
kwargs["queryset"] = [Link](Aktif=True)
return super(ServisFormAdmin, self).formfield_for_foreignkey(db_field, request,
**kwargs)

olarak deitirelim.
formfield_for_foreignkey fonksiyonu, snfmza ait foreignkey
fieldlarn kullanmamz salar.

Yani bu fieldlara kstlama ya da yetkilendirme koyabiliriz.

Mteri kstlamasn test etmek iin

bir mterinin aktif durumunu pasife ekip kaydediyoruz.

Foreignkey kstlamasn da bylelikle grm olduk.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
58
Servis formu kaydn yapabiliyoruz ama teslim edilen rnleri
eklememiz gerekiyor. Biraz nce bahsettiim gibi bir forma ait ok
rn ekleyebiliriz. Bu vesile ile inline tablolar da grm olacaz.

[Link] dosyamz aalm

Dikkat edin ServisForm dan sonra eklemeniz gerekiyor.

[Link]:
..
..
..
class Urunler ( [Link] ) :
ServisFormu = [Link] ( ServisForm )
Cins = [Link] ( u'Cinsi', max_length = 30 )
Marka = [Link] ( u'Marka', max_length = 50 )
Model = [Link] ( u'Model', max_length = 50 )
SeriNo = [Link] ( u'Seri No', max_length = 250 )
GarantiBitis = [Link] ( u"Garanti Biti", default=[Link] )
Sikayet = [Link] ( u'ikayet' )
Aksesuar = [Link] ( Aksesuarlar, blank=True )
Durum = [Link] ( Durumlar )
Not = [Link] ( u'Yaplan lemler', blank=True )
def __unicode__(self):
return "%s %s %s" % ([Link], [Link], [Link])
class Meta:
verbose_name_plural = u"rnler"
verbose_name = u"rn"

Not: ManyToManyField kullandk, yani bir indexleme


yaparak baka bir tablodaki kaytlardan oklu seim yapabiliriz.
TextField kullandk, Uzun aklamalar girebiliriz.

[Link]:
..
..
class UrunlerInline([Link]):
model = Urunler
###hangi model
extra = 0
### yeni eklenmek istendiinde ka tane rn ekleme yapsn. lk kaytta hazr olarak rn ekleme
sayfas getirmeyecek biz ekle deyince 1 tane rn ekleme sayfas aacak.
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
59
max_num = 5
### en fazla kayt rn eklenebilir.
class ServisFormAdmin([Link]):
inlines = [ UrunlerInline, ]
list_display = ( 'FormNo', 'Musteri', 'TeslimEden', 'TeslimAlan',
'KayitTarihi', 'Yazdir' )
list_per_page = 50
ordering = ( '-KayitTarihi', )
date_hierarchy = 'KayitTarihi'
search_fields = ( 'FormNo', 'Musteri__Yetkili', 'Musteri__Telefon' )
exclude = ( 'KayitTarihi', )
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'TeslimAlan':
kwargs["queryset"] = [Link](Aktif=True)
if db_field.name == 'Musteri':
kwargs["queryset"] = [Link](Aktif=True)
return super(ServisFormAdmin, self).formfield_for_foreignkey(db_field, request,
**kwargs)

Not: UrunlerInline snfn register etmiyoruz.

./[Link] makemigrations servisformu && ./[Link] migrate && ./[Link] runserver

extra=0 dediimiz iin rn sayfas ak gelmedi, Baka bir rn


ekle linki ile rn ekleme sayfamz gelecek.

Not:
Tasarmsal olarak daha uygun olduunu StackedInline kullandk.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
60
TabularInline kullansaydk yana doru uzayacakt.

Servis formumuza yeni bir kayt girdiimizde aadaki gibi


gzkecek.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
61
Bonus: Veritaban ilemleri iin ben RazorSQL
kullanyorum. Bilinen tm veritabanlarn destekliyor ve kullanm
ok basit.

[Link]

Oluturduumuz servis formunun ktsn almak iin yazdr adnda


bir fonksiyon oluturup grid e eklemitik. imdi de bu kaydn html
zerinde gsterimine deinelim.

[Link] dosyamz ap yazdracamz kaydn id si ile eletirme


yaparak elde edilen deerleri html dosyasna gndereceiz.

[Link]:
def sayfayiyazdir(request, idsi):
### request art. Olmazsa olmaz. Bu fonksiyona en azndan bir id deeri gerekiyor.

formdurumu = [Link](id = idsi)


## bu id ye ait form bilgileri

formbilgileri = [Link](ServisFormu__id = idsi)


### buid ye ait rnlerin listesi
#### ServisFormu__id ile gelen id yi indexlediimiz servisformu tablosundaki id ile
eletiriyoruz.
### rnek olmas iin bu ekilde yazdm.

return render(request, '[Link]', {'formbilgileri': formbilgileri,


'formdurumu':formdurumu})
### bulduumuz bilgileri [Link] dosyasna gdneriyoruz. Tabi ki templates klasrmzde

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
62
[Link] dosyamz aalm ve kodlarmz yazalm.

[Link]:
from [Link] import sayfayiyazdir
urlpatterns = [
url(r'^yazdir/([\w\-]+)/$', sayfayiyazdir, name='sayfayiyazdir'),
url(r'^admin/', [Link]),
]

/yazdir/***/ diye bir link geldiinde servisformu uygulama


klasrmzdeki [Link] dosyasnda ki sayfayiyazdir fonksiyonunu
altracaz.

Not:
([\w\-]+) her eyi yazabiliriz. (+id...) kullanabilirdik ama bu daha
ok iinize yarayacak, aklnzda bulunsun.

Templates klasrmzde [Link] adnda bir dosya oluturalm.

[Link]:
<!DOCTYPE html>
<html lang="en">
<head>
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><![endif]-->
<meta charset="utf-8">
<title>zmir Teknik Servis, Servis Formu kontrol, durum renme |
[Link]</title>
<meta name="description" content="zmir Teknik Servis, Servis Formu kontrol, durum
renme"/>
<link rel="canonical" href="[Link]
<link href='[Link] rel='stylesheet'
type='text/css'>
<link rel="shortcut icon" href="/media/[Link]">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="[Link]
<script src="[Link]
<script src="[Link]
<style>
.borderless tbody tr td, .borderless tbody tr th, .borderless thead tr th {
border: none;
}
</style>
</head>
<body onload="[Link]()">
<div class="container">
<h1>{{ [Link] }}</h1>
<p>{{ [Link]|title }} ({{ [Link]|title }}) - {{
[Link] }}</p>
<table class="table table-condensed">
<thead>
<tr>
<th>rn</th>
<th>Seri No</th>
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
63
<th>ikayet</th>
<th>Aksesuar</th>
<th>Not</th>
</tr>
</thead>
<tbody>
{% for k in formbilgileri %}
<tr>
<td>{{ [Link]|upper }} | {{ [Link]|upper }} | {{ [Link]|upper }}</td>
<td>{{ [Link]|upper }}</td>
<td>{{ [Link]|title }}</td>
<td>{% for kk in [Link] %}{{ kk|title }} {% endfor %}</td>
<td>{{ [Link] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="container">
<table class="table table-condensed borderless">
<tr>
<th>Servise Teslim Eden</th>
<th>Teknisyen</th>
<th>rn Teslim Alan</th>
</tr>
<tr>
<th>{{ [Link]|title }}</th>
<th>{{ [Link]|title }}</th>
<th></th>
</tr>
</table>
</div>
<div class="container">
<table border="0" cellspacing="" width="100%">
<tr><td><i style="font-size:12px;">Bakm ve onarm sresi 3 () aydr.</i></td></tr>
<tr><td><i style="font-size:12px;">Servisimizde asla kaak yazlm kullanlmamakta ve
destek verilmemektedir.</i></td></tr>
<tr><td><i style="font-size:12px;">Tamire gelen cihazlarn harddisk, yazlm ve
yedeklerinden tarafmz sorumlu deildir.</i></td></tr>
<tr><td><i style="font-size:12px;">Servise gelen rnlerde nceden bildirilmeyen
sorunlardan tarafmz sorumlu deildir.</i></td></tr>
<tr><td><i style="font-size:12px;">Servise teslim edilen rnlerin emanet sresi 30
(otuz) gn olup, sonrasnda firmamzn sorumluluu yoktur.</i></td></tr>
<tr><td><i style="font-size:12px;">Servise gelen cihazlarn chip deiim ve
kalplanmasnda oluabilecek sorunlarda tarafmz sorumlu deildir.</i></td></tr>
</table>
</div>
</body>
</html>

imdi servis formuna kayt girerek yazdr linkini tklayabiliriz.

rn:

[Link]

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
64
Aada ilk kaydmza ait kty grebiliriz.

Bonus: Foreign ve ManyToMany gibi indexleme


durumlarnda gelen elementlerin yannda dzenlemek ve yeni kayt
eklemek iin simgeler yardmc olacaktr.

Herhangi bir kayd setiinizde dzenleme aktif olur. Ek pencerede


yeni kayt ya da dzenleme ilemi yapabilirsiniz.

Aa yukar bir serviste olmas gereken tm eksiklikleri gideren


Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
65
bir web sitesi hazrlam olduk. Kayt girerek eksikleri grebilir test
edebilirsiniz.
Ve geri bildirim olarak dnerseniz sevinirim.

Yarn daha fazla admin sayfas dzenleme ve [Link] da save


modllerine bakacaz ve hata alarak almalara devam edeceiz.

Dn admin sayfasndan gelen yazdr linkine cevap olarak


sorgulama yaptrp direk yazdr komutu vermitik.

Bugn de [Link] ile veri ekip ekrana bastrmaya ve veri


sorgulamaya bakacaz.

nce direk html dosyasna ynlendirme yaparak bu konuya da


deinmi olalm.

[Link] dosyamza aadaki kodlar yazalm.

import edilecek fonksiyon

[Link]:
from [Link] import TemplateView

TemplateView hazr fonksiyondur ve view gibi kullanlarak direk


html (txt, xml de olabilir) dosyasna ynlendirme yapabiliriz.

[Link]:
url(r'^$', TemplateView.as_view(template_name="[Link]")),

bu fonksiyonu kullanabilmemiz iin templates klasrnde


[Link] dosyas oluturmu olmamz gerekiyor.

[Link]:
<!DOCTYPE HTML>
<html>
<head>
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><![endif]-->
<meta charset="utf-8">
<title>zmir Teknik Servis, Servis Formu kontrol, durum renme |
[Link]</title>
<meta name="description" content="zmir Teknik Servis, Servis Formu kontrol, durum
renme"/>
<link rel="canonical" href="[Link]
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
66
<link href='[Link] rel='stylesheet'
type='text/css'>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" href="/media/[Link]">
<link rel="stylesheet" href="/media/[Link]">
</head>
<body>
<div id='wrap'>
<div id="sonuclarimuslu"
style="color:#ffffff;font-size:2.4vw;position:fixed;width:95%;top:20%;left:50%;-webkit-
transform:translate(-50%, -50%);transform: translate(-50%, -50%);">
</div>
<div id='content'>
<section class='input'>
<div>
<input type='text' placeholder='Form No' id="arama" maxlength="8">
</div>
</section>
</div>
</div>
<script src="/media/[Link]"></script>
<script src="/media/[Link]"></script>
<script src='/media/[Link]'></script>
<script>
$('section :input').val('').fancyInput()[0].focus();
var aramam = [Link]('arama');
var sonuclarimuslu = [Link]('sonuclarimuslu');
[Link]('keypress', function (event) {
if ([Link] == 13) {
[Link] = "";
if ([Link] == 8) {
[Link] = "Sorgulanyor...<br /> Ltfen bekleyiniz.";
$.post("/kn/", {
TakipNo: [Link],
csrfmiddlewaretoken: "{{ csrf_token }}"
}, function (data) {
[Link] = data;
});
} else {
[Link] = "Uygun bir arama kategorisi bulunamad!";
[Link](function () {
[Link]();
}, 0);
}
}
});
</script>
</body>
</html>

bu dosyamzda kullandmz media dosyalarn github tan


edinebilirsiniz.

Hatrlarsanz [Link] dosyamza media root ve url eklemitik.


Projemize ait olan css, js, jpg, png vs.. gibi dosyalar media
klasrmzde tutacaktk.

[Link]
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
67
MEDIA_ROOT = BASE_DIR + '/media/'
MEDIA_URL = '/media/'

media linkini kullanabilmemiz iin ayrca url ynlendirmesini de


aktif etmemiz gerekiyor.

[Link] dosyamza aadaki kodlarmz ekleyelim.

[Link]:
from [Link] import settings
from [Link] import static
urlpatterns = [
..
..
..
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Terminalde ./[Link] runserver ile servermz balatalm.

[Link]

Alnabilecek hatalar:
SyntaxError: Non-ASCII character '\xc3' in file
/home/muslu/django/teknikservistakibi/servisformu/[Link] on line 11, but no
encoding declared; see [Link] for details
[Link] dosyasnn en bana # -*- coding: utf-8 -*- eklemeyi
unuttunuz.

Jquery post ilemini kullanarak /kn/ linki ne yazlan takip noyu


gnderip dnen bilgiyi sonuclarimuslu divine yazdracaz.

$.post("/kn/", {
TakipNo: [Link],
csrfmiddlewaretoken: "{{ csrf_token }}"
}, function (data) {
[Link] = data;
});

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
68
Dikkat ederseniz csrf_token kullandk. Bu konuda ileride de hata
alabilirsiniz. nemli bir konu ksaca deinelim ama detayl bilgi
isterseniz aadaki linkte gayet gzel anlatlm.

[Link]
[Link]

Sayfay okuduktan sonra yle bir husus ortaya km oluyor.


Django gelitiricileri bilinen tm saldr ve aklara kar gerekten
sper bir i karyorlar.

Eer sitenize dardan bir saldr yaplmak istenirse csrf_token ile


retilen ve erezde saklanan bu rastgele deer karlatrlr ve
sitenize dardan mdahaleye izin vermez.

Csrf ile ilgili ileride daha fazla aklama yapacaz, imdiden


kafanz karmasn.

Ana sayfamz hazrladktan sonra imdide [Link] dosyamz


aalm ve ana sayfamzdan gelen sorguya cevap iin bir
ynlendirme yapalm.

[Link]:
def formdurumusorgula(request):
formno = [Link]('TakipNo', None)
### post ile gelen TakipNo'yu formno deikenine alyoruz. TakipNo parametresi yoksa None
dndr. None yerine istediiniz Bir ey yazarak yoksa bu olsun diyebilirsiniz.
Try:
formdurumu = [Link](FormNo = formno)
urunler = [Link](ServisFormu__id = [Link])
### gelen formnoya gre veritabanndan bilgileri alyoruz.
### bu bilgileri bir string te toplayarak geri gndereceiz. Bu ekilde sayfa yenilenmeden divin
iinde dnen bilgiler gzkecek.
htmltablo = u"<table style='width:100%;'><tr><th style='width:40%;'
align='left'>rn</th><th style='width:40%;' align='left'>NOT</th><th style='width:20%;'
align='left'>Durum</th></tr>"
for k in urunler:
htmltablo += "<tr>"
htmltablo += "<td align='left'>" + [Link]() + "(" + [Link]() + " "
+ [Link]() + ")</td>"
htmltablo += "<td align='left'>" + [Link] + "</td>"
htmltablo += "<td align='left'>" + [Link] + "</td>"
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
69
htmltablo += "</tr>"
htmltablo += "</table>"
return HttpResponse(htmltablo)
### HttpResponse gzel ama ingilizce. Buradan ne gnderirseniz tarayc direk onu basar
ekrana.
except:
return HttpResponse("Form no bulunamad!")
return HttpResponse("Form no bulunamad!")

[Link] dosyamz aalm ve ana sayfa linki geldiinde [Link] de


ki formdurumusorgula fonksiyonunu kullanmak iin bir url
fonksiyonu yazalm.

[Link]:
# -*- coding: utf-8 -*-
from [Link] import settings
from [Link] import url
from [Link] import admin
from [Link] import static
from [Link] import TemplateView
from [Link] import sayfayiyazdir, formdurumusorgula
urlpatterns = [
url(r'^$', TemplateView.as_view(template_name="[Link]")),
url(r'^kn/$', formdurumusorgula, name='formdurumusorgula'),
url(r'^yazdir/([\w\-]+)/$', sayfayiyazdir, name='sayfayiyazdir'),
url(r'^admin/', [Link]),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Not: nce [Link] yi ya da [Link] yi hazrlamak size kalm.


Aklnzda gidilecek yolu hazrladysanz hangisini nce hazrlamak gerektii
nemli deil.

Terminalde:

./[Link] runserver

[Link]

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
70
Ekrann alt ortasnda grebileceiniz gibi Form Data olarak
TakipNo ve csrfmiddlewaretoken parametreleri gnderildi.

[Link] ye print ekleyerek gelen takipno karl okunabilir.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
71
Tekrar print komutu ile dnen bilgileri kontrol edelim.

[Link]
..
..
..
..
htmltablo += "</table>"
print htmltablo
return HttpResponse(htmltablo)

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
72
Daha nceden bir servis kayd oluturmutuk. Oluturmadysanz
ynetim panelinden bir kayt oluturun ve formno yu ana sayfaya
yazarak sorgulayn.

Dng ile oluturulan htmltablo string i HttpResponse ile tekrar


geri gnderiliyor ve div in iine yazdrlarak sayfa yenilenmeden
ekrana bastrlyor.

Olaylara tekrar bakalm.

1. Taraycdan bir sorgu geldi ( /kn/ )


2. [Link] kn linkinin hangi fonksiyona ait olduuna bakp
[Link] ye ynlendirdi
3. [Link] [Link] den veri ekip html dosyasna gnderdi
4. html dosyas gelen bilgileri ekrana yanstt
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
73
Not: Kullandlan js ler taraycya gre sorunlar
yaatabilir ama fikir vermek asndan iinize yarayacak.

Artk alan bir web sitemiz var ve bir ok konuya deindik. imdi
veritabannda alan ekleme ilemlerine bakalm.

Servis Formlara rn eklerken oklu ekleme yapyorduk ama


rnlerin hepsi ayn anda teslim edilmeyecek!

O zaman inline olarak tanmladmz rnlere tek tek teslimat


tarihi eklememiz gerekir.

[Link] ye ekleyeceimiz yeni alan, migrate ile otomatik olarak


veritabanna eklenecektir.

Django 1.9 da migration lar sorunsuz alyor diye gzkyor.

nceden bir alan eklendiinde veritabanna elle eklememiz


gerekiyordu, ki birazdan buna da bakacaz.

[Link]:
class Urunler ( [Link] ) :
ServisFormu = [Link] ( ServisForm )
Cins = [Link] ( u'Cinsi', max_length = 30 )
Marka = [Link] ( u'Marka', max_length = 50 )
Model = [Link] ( u'Model', max_length = 50 )
SeriNo = [Link] ( u'Seri No', max_length = 250 )
GarantiBitis = [Link] ( u"Garanti Biti", default=[Link] )
Sikayet = [Link] ( u'ikayet' )
Aksesuar = [Link] ( Aksesuarlar, blank=True )
Durum = [Link] ( Durumlar )
Not = [Link] ( u'Yaplan lemler', blank=True )
TeslimatTarihi = [Link] ( u"Teslimat Tarihi", default=[Link],
blank=True )
def __unicode__(self):
return "%s %s %s" % ([Link], [Link], [Link])
class Meta:
verbose_name_plural = u"rnler"
verbose_name = u"rn"

Terminalde:

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
74
./[Link] makemigrations servisformu && ./[Link] migrate && ./[Link] runserver

....
0005_auto_20160115_1151.py:
- Add field TeslimatTarihi to urunler
- Alter field Kodu on musteriler
- Alter field FormNo on servisform
...
..

bilgileri ekranda yazmas gerekiyor. Alanda eksik bir parametre


olursa hata olarak belirtecek.

Dn ki konuda bahsetmitim ben RazorSQL kullanyorum.


TeslimatTarihi alann eklemeden nce ki tablomuz bu halde idi.

Migration yaptktan sonra ise aada greceiniz gibi alan


Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
75
otomatik olarak ekledi.

Tabi uygulama klasrmzdeki migrations klasrnn iindekileri


silmemi olmanz gerekiyor. nk tm yaptnz ekleme, silme ve
dzenleme ilemleri burada anlk kayt altna alnyor ve migrate
ettiimizde buna gre veritaban tekrar ayarlanyor.

Migrations klasr ierii

muslu@muslu-MS-7641:~/django/teknikservistakibi/servisformu/migrations$ tree .
.
0001_initial.py
0001_initial.pyc
0002_auto_20160114_1519.py
0002_auto_20160114_1519.pyc
0003_auto_20160114_1520.py
0003_auto_20160114_1520.pyc
0004_auto_20160114_1526.py
0004_auto_20160114_1526.pyc
0005_auto_20160115_1151.py
0005_auto_20160115_1151.pyc
0006_auto_20160115_1152.py
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
76
0006_auto_20160115_1152.pyc
0007_auto_20160115_1152.py
0007_auto_20160115_1152.pyc
0008_auto_20160115_1156.py
0008_auto_20160115_1156.pyc
0009_auto_20160115_1156.py
0009_auto_20160115_1156.pyc
__init__.py
__init__.pyc

0 directories, 20 files

Tabloya bir alan elle eklemek isterseniz RazorSQL'de tablo


seilerek sa tu ile menden Alter seilebilmeli.

Kaytlarn girdikten sonra imdi de xml ile darya kartmaya bakalm.

Daha nceden de belirttiim gibi [Link] dosyamzda gelen linke karlk


olarak direk bir xml sayfasna ynlendirme yapabiliriz ancak burada kaytlar
ekmemiz gerekiyor. Yani [Link] dosyamzda bir fonksiyon oluturarak
kaytlar filtreleyip bir xml dosyasna gndereceiz. Djangon kendi xml
fonksiyonu var ancak kafanzn karmamas iin basit yntem kullanacaz ve
iimizi yine grm olacak.

Hemen [Link] dosyamz aalm ve tm formlar ekeceimiz bir sorgu


( queryset ) oluturalm.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
77
[Link]
def xmlcikart(request):
tumformlar = [Link].order_by('-KayitTarihi')
### Tm servis formlarn kayt tarihlerini sondan baa doru sralayarak 2 tanesini al. Yani
son 2 kayd al
return render(request, '[Link]', {'tumformlar': tumformlar},
content_type="application/xml")
### tumformlar adnda toparladmz son 2 kayd [Link] dosyasna gnderiyoruz.
### Bu arada gnderdiimiz dosyann tr xml
### eski versiyonlarda mime_type olarak kullanlmal
### "application/xml" de kullanlabilir

imdide bu fonksiyonu kullanabilmek iin [Link] dosyamz aarak bir link


oluturup ynlendirelim.

[Link]
urlpatterns = [
url(r'^$', TemplateView.as_view(template_name="[Link]")),
url(r'^kn/$', formdurumusorgula, name='formdurumusorgula'),
url(r'^xml/$', xmlcikart, name='xmlcikart'),
url(r'^yazdir/([\w\-]+)/$', sayfayiyazdir, name='sayfayiyazdir'),
url(r'^admin/', [Link]),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

ben xml/ linkini verdim siz farkl kullanabilirsiniz.

imdi de dnecek olan bilgilerin ekrana bastralaca xml dosyamz


oluturalm.

Templates klasrnde [Link] adnda bir dosya oluturup,

[Link]:
<?xml version="1.0" encoding="UTF-8"?>
<ServisFormlari>
{% for k in tumformlar %}
<FormNo>{{ [Link] }}</FormNo>
{% endfor %}
</ServisFormlari>

kayt edip ./[Link] runserver [Link]

ile test edebilirsiniz.

[Link] dosyamz daha da gelitirerek farkl konulara deinelim.

CDATA: XML ierisinde gelen bilgilerden, kark karakterlerde sorun


yaamamak iin kullanrz.

_set.all: inline ile baladmz tablodan veri ekerken kullanmamz


gerekiyor.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
78
.all: ManyToMany ile baladmz tablodan veri ekmek

[Link] : Dngdeki dnen veri says


forloop.counter0: Balang saysn 0 dan balatr

[Link]:
<?xml version="1.0" encoding="UTF-8"?>
<ServisFormlari>
{% for k in tumformlar %}
<Form>
<Sira>{{ [Link] }}</Sira>
<FormNo>{{ [Link] }}</FormNo>
<Musteri><![CDATA[{{ [Link] }}]]></Musteri>
<TeslimEden><![CDATA[{{ [Link] }}]]></TeslimEden>
{% for l in k.urunler_set.all %}
<Cins><![CDATA[{{ [Link]|upper }}]]></Cins>
<Marka><![CDATA[{{ [Link]|upper }}]]></Marka>
<Model><![CDATA[{{ [Link]|upper }}]]></Model>
<SeriNo><![CDATA[{{ [Link] }}]]></SeriNo>
<Sikayet><![CDATA[{{ [Link] }}]]></Sikayet>
<Durum><![CDATA[{{ [Link] }}]]></Durum>
{% for kk in [Link] %}
<Aksesuar><![CDATA[{{ kk|title }}]]></Aksesuar>
{% endfor %}
{% endfor %}
</Form>
{% endfor %}
</ServisFormlari>

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
79
ServisFormlari Ana etiketi altnda her bir kayt Form etiketi ile ayrlacaktr.

Tm servis formlarn xml olarak yaynlam olduk.


19 Ocak 2016

Eer xml yolunu dosya d ve uzants gibi yaynlamak istersek;

rn: [Link]

[Link] dosyamza bu yolu da tanmlamamz gerekiyor.

[Link]:
urlpatterns = [
url(r'^$', TemplateView.as_view(template_name="[Link]")),
url(r'^kn/$', formdurumusorgula, name='formdurumusorgula'),
url(r'^xml/$', xmlcikart, name='xml'),
url(r'^urunler\.xml$', xmlcikart, name='urunlerxml'),
url(r'^yazdir/([\w\-]+)/$', sayfayiyazdir, name='sayfayiyazdir'),
url(r'^admin/', [Link]),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
80
Yeni url iin r'^urunler\.xml$' kullandm, buradan anlalmas
gereken husus illa dosya adyla linkin ayn olmas gerekmedii.
Yani istediiniz gibi bir link ile istediiniz bir dosyay
kullanabilirsiniz.

altrlacak fonksiyon iin yine xmlcikart fonksiyonu arld


ama isim olarak urunlerxml kullandm.

imdi burada da u konuya deineceiz; isterseniz ayn fonksiyonu


arp farkl ilemler yaptrabilirsiniz. Bunu nerede
kullanacaksnz? Bir sat sitesinde seo amal olarak farkl
linkleme yaps kullanp ayn fonksiyonu ararak farkl ilemler
yapabilirsiniz. Kafanz karmasn hepsine deineceiz.

[Link]:
def xmlcikart(request):
tumformlar = [Link].order_by('-KayitTarihi')

from [Link] import resolve


GelenUrl = resolve( request.path_info ).url_name
print GelenUrl

return render(request, '[Link]', {'tumformlar': tumformlar},


content_type="application/xml")

[Link] de tanmladmz name tanmlamalarna ulamamz iin


django core da bulunan resolve ( zmek ) fonksiyonunu
kullanacaz.

Daha sonra GelenUrl adnda bir deiken ile name lere ulaabiliriz.

[Link]

Gelen urlmiz urunlerxml ise sadece 1 kayt gstersin:


Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
81
[Link]:
def xmlcikart(request):
tumformlar = [Link].order_by('-KayitTarihi')
from [Link] import resolve
### isterseniz yukarya tammlayabilirsiniz.
GelenUrl = resolve( request.path_info ).url_name
if GelenUrl == "urunlerxml":
print tumformlar
tumformlar = tumformlar[0:1]
print tumformlar
### tumformlar bir liste olduu iin 1 kayt al diyebilir ve tekrar ayn isimle
tanmlayabiliriz
return render(request, '[Link]', {'tumformlar': tumformlar},
content_type="application/xml")

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
82
lk print te tumformlar n tm kaytlar ierdiini
[Link] tanmlamada ise son kayd [Link]
denemeler yaparak hata almaya aln ve neden olduunu kontrol
edin.
2 yntemle xml dosyasna ynlendirme yaptk. imdi de sabit bir
xml dosyasna ynlendirme ilemlerine bakalm.

Diyelim ki; site haritas iin bir [Link] dosyas oluturdunuz


ve bu dosyay kullanmak istiyorsunuz.

TemplateView fonksiyonunu hatrlam olmanz gerekiyor. Bu


yntemle gelen url isteini bu dosyamza ynlendirebiliriz.

[Link]

[Link]:
urlpatterns = [
url(r'^$', TemplateView.as_view(template_name="[Link]")),
url(r'^kn/$', formdurumusorgula, name='formdurumusorgula'),
url(r'^xml/$', xmlcikart, name='xml'),
url(r'^urunler\.xml$', xmlcikart, name='urunlerxml'),

url(r'^sitemap\.xml', TemplateView.as_view(template_name='[Link]',
content_type='application/xml')),

url(r'^yazdir/([\w\-]+)/$', sayfayiyazdir, name='sayfayiyazdir'),


url(r'^admin/', [Link]),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Alnabilecek hatalar:

Exception Type: TemplateDoesNotExist


Exception Value: [Link]

veya

Exception Type: TemplateDoesNotExist


Exception Value: [Link]

Ynlendirdiiniz dosya ad hatal. Oluturmadnz yada yanl


yazdnz

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
83
Html harici xml kullanmaya baktk imdi de txt dosyasna
deinelim.

Biliyorsunuz ki arama motorlar [Link] dosyalar ile sitenin


hangi sayfalarnn ve yollarnn taranp taranmamas gerektiine
bakarlar.

[Link] dosyamza [Link] iin bir yol ekleyip ynlendirmesini


yapalm.

[Link]:
urlpatterns = [
url(r'^$', TemplateView.as_view(template_name="[Link]")),
url(r'^kn/$', formdurumusorgula, name='formdurumusorgula'),
url(r'^xml/$', xmlcikart, name='xml'),
url(r'^urunler\.xml$', xmlcikart, name='urunlerxml'),
url(r'^sitemap\.xml', TemplateView.as_view(template_name='[Link]',
content_type='application/xml')),

url(r'^robots\.txt', TemplateView.as_view(template_name='[Link]',
content_type='text/plain')),

url(r'^yazdir/([\w\-]+)/$', sayfayiyazdir, name='sayfayiyazdir'),


url(r'^admin/', [Link]),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

[Link]

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
84
Ynlendirme mantn rendiimize gre tekrar ana sayfamza
dnerek sayfa parselleme ( block ) kullanmlarna bakalm.

Sayfanzda srekli yklenmesi gereken alanlar var ise, rnein


men, footer vs.. gibi bunlarn her seferinde sayfalara
eklemektense block kullanarak sayfa arldnda ekleyebiliriz.

Diyelim ki her sayfamzda alt ve stte sabit divler var ve bunlar


srekli eklenmesi gerekiyor o zaman sabit olacak olan alanlarn
olaca bir html dosyas oluturalm. Ben genelde [Link]
olarak kullanyorum.

[Link]:
<!DOCTYPE HTML>
<html>
<head>
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><![endif]-->
<meta charset="utf-8">
<title>zmir Teknik Servis, Servis Formu kontrol, durum renme |
[Link]</title>
<meta name="description" content="zmir Teknik Servis, Servis Formu kontrol, durum
renme"/>
<link rel="canonical" href="[Link]
<link href='[Link] rel='stylesheet'
type='text/css'>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" href="/media/[Link]">
<link rel="stylesheet" href="/media/[Link]">
<style>
#sabitust {
position: fixed;
left: 0px;
top: 0px;
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
85
height: 100px;
width: 100%;
background: #44B78B;
z-index: 9999;
line-height: 100px;
}
#sabitalt {
position: fixed;
left: 0px;
bottom: 0px;
height: 40px;
width: 100%;
background: #C9F0DD;
z-index: 9999;
line-height: 40px;
}
/* IE 6 | ne olur ne olmaz ama fikriniz olur */
* html #footer {
position: absolute;
top: expression((0-([Link])+([Link] ?
[Link] : [Link])+(ignoreMe =
[Link] ? [Link] :
[Link]))+'px');
}
</style>
<!-- [Link] head aras -->
</head>
<body>
<div id="sabitust">Sabit st</div>
<!-- buras [Link] block ortann bir st satr -->
{% block orta %}
<!-- mey dey [Link] block ortann ii -->
{% endblock orta %}
<!-- [Link] block ortann bittii yer -->
<div id="sabitalt">Sabit Alt</div>
<script src="/media/[Link]"></script>
<script src="/media/[Link]"></script>
<script src='/media/[Link]'></script>
<script>
$('section :input').val('').fancyInput()[0].focus();
var aramam = [Link]('arama');
var sonuclarimuslu = [Link]('sonuclarimuslu');
[Link]('keypress', function (event) {
if ([Link] == 13) {
[Link] = "";
if ([Link] == 8) {
[Link] = "Sorgulanyor...<br /> Ltfen bekleyiniz.";
$.post("/kn/", {
TakipNo: [Link],
csrfmiddlewaretoken: "{{ csrf_token }}"
}, function (data) {
[Link] = data;
});
} else {
[Link] = "Uygun bir arama kategorisi bulunamad!";
[Link](function () {
[Link]();
}, 0);
}
}
});
</script>
</body>
</html>

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
86
[Link] dosyamza {% block orta %}{% endblock orta %}
etiketleri (templatetags) ile dier sayfalar arldnda
eletirilecek alanlar belirttik.

Yani sayfann burasna dier sayfadaki bu isimle tanmlanan block


ierikleri yklenecek.

[Link]:
{% extends "[Link]" %}
{% block orta %}
<!--buras [Link] de block ortadan hemen sonraki yer -->
<div id='wrap'>
<div id="sonuclarimuslu"
style="color:#ffffff;font-size:2.4vw;position:fixed;width:95%;top:20%;left:50%;-
webkit-transform:translate(-50%, -50%);transform: translate(-50%, -50%);">
</div>
<div id='content'>
<section class='input'>
<div>
<input type='text' placeholder='Form No' id="arama" maxlength="8">
</div>
</section>
</div>
</div>
<!--buras da [Link] de block kapanmadan nceki yer -->
{% endblock orta %}

extends etiketi ile (templatetags) nce [Link] dosyasn


arp {% block orta %} ile balayp {% endblock orta %} ile
biten kodlar [Link] de ayn block etiketlerinin arasna ykle
dedik.

Bonus: Extends (devam ettirmek anlamna gelir)

Alnabilecek hatalar:
Exception Type: TemplateDoesNotExist
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
87
Exception Value: [Link]
extends edilecek html dosyasnn ad hata yazld.

Kafanz karmasn hemen daha iyi pekimesi iin html kodlarna


bir eyler yazdk.

[Link]

view-source:[Link]

te bu kadar.

Tm aklama satrlar bir arada iken herey daha mantkl oldu.

Bu ekilde bir ok parselleme yapabilirsiniz.

Hatta bir sayfa daha oluturup hemen test edelim.

Hemen [Link] dosyamza yeni bir link oluturalm:

[Link]:
urlpatterns = [
url(r'^$', TemplateView.as_view(template_name="[Link]")),

url(r'^test/$', TemplateView.as_view(template_name="[Link]")),

url(r'^kn/$', formdurumusorgula, name='formdurumusorgula'),


url(r'^xml/$', xmlcikart, name='xml'),
url(r'^urunler\.xml$', xmlcikart, name='urunlerxml'),
url(r'^sitemap\.xml', TemplateView.as_view(template_name='[Link]',
content_type='application/xml')),
url(r'^robots\.txt', TemplateView.as_view(template_name='[Link]',
content_type='text/plain')),
url(r'^yazdir/([\w\-]+)/$', sayfayiyazdir, name='sayfayiyazdir'),
url(r'^admin/', [Link]),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

[Link]:
{% extends "[Link]" %}
{% block orta %}
<!--buras [Link] st -->
<div id='wrap'>
<div style="color:#ffffff;font-size:2.4vw;position:fixed;width:95%;top:20%;left:50%;-
webkit-transform:translate(-50%, -50%);transform: translate(-50%, -50%);">
Ne olacak bu Gztepe'nin hali?
</div>
</div>
<!--buras [Link] alt -->
{% endblock orta %}

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
88
[Link]:
<div id="sabitust">
<p><a href="/">Ana Sayfa</a> | <a href="/test/">Test</a></p>
</div>

[Link]

Sanrm daha iyi pekimitir.

sterseniz bir block daha oluturalm ve sadece belirli sayfalarda


kullanalm.

[Link]:
<!DOCTYPE HTML>
<html>
<head>
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><![endif]-->
<meta charset="utf-8">
<title>zmir Teknik Servis, Servis Formu kontrol, durum renme |
[Link]</title>
<meta name="description" content="zmir Teknik Servis, Servis Formu kontrol, durum
renme"/>
<link rel="canonical" href="[Link]
<link href='[Link] rel='stylesheet'
type='text/css'>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" href="/media/[Link]">
<link rel="stylesheet" href="/media/[Link]">
<style>
#sabitust {
position: fixed;
left: 0px;
top: 0px;
height: 100px;
width: 100%;
background: #44B78B;
z-index: 9999;
line-height: 100px;
}
#sabitalt {
position: fixed;
left: 0px;
bottom: 0px;
height: 40px;
width: 100%;
background: #C9F0DD;
z-index: 9999;
line-height: 40px;
}
/* IE 6 | ne olur ne olmaz ama fikriniz olur */
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
89
* html #footer {
position: absolute;
top: expression((0-([Link])+([Link] ?
[Link] : [Link])+(ignoreMe =
[Link] ? [Link] :
[Link]))+'px');
}
</style>
<!-- [Link] head aras -->
</head>
<body>
<div id="sabitust">
<p><a href="/">Ana Sayfa</a> | <a href="/test/">Test</a></p>
</div>
<!-- buras [Link] block ortann bir st satr -->
{% block orta %}
<!-- mey dey [Link] block ortann ii buras -->
{% endblock orta %}
<!-- [Link] block ortann bittii yer -->
<div id="sabitalt">Sabit Alt</div>
<script src="/media/[Link]"></script>
<script src="/media/[Link]"></script>

{% block jsozel %}{% endblock jsozel %}

<script>
$('section :input').val('').fancyInput()[0].focus();
var aramam = [Link]('arama');
var sonuclarimuslu = [Link]('sonuclarimuslu');
[Link]('keypress', function (event) {
if ([Link] == 13) {
[Link] = "";
if ([Link] == 8) {
[Link] = "Sorgulanyor...<br /> Ltfen bekleyiniz.";
$.post("/kn/", {
TakipNo: [Link],
csrfmiddlewaretoken: "{{ csrf_token }}"
}, function (data) {
[Link] = data;
});
} else {
[Link] = "Uygun bir arama kategorisi bulunamad!";
[Link](function () {
[Link]();
}, 0);
}
}
});
</script>
</body>
</html>

[Link]:
{% extends "[Link]" %}
{% block orta %}
<div id='wrap'>
<div id="sonuclarimuslu"
style="color:#ffffff;font-size:2.4vw;position:fixed;width:95%;top:20%;left:50%;-
webkit-transform:translate(-50%, -50%);transform: translate(-50%, -50%);">
</div>
<div id='content'>
<section class='input'>
<div>
<input type='text' placeholder='Form No' id="arama" maxlength="8">
</div>
</section>
</div>
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
90
</div>
{% endblock orta %}
{% block jsozel %}
<script src='/media/[Link]'></script>
<script>
$('section :input').val('').fancyInput()[0].focus();
var aramam = [Link]('arama');
var sonuclarimuslu = [Link]('sonuclarimuslu');
[Link]('keypress', function (event) {
if ([Link] == 13) {
[Link] = "";
if ([Link] == 8) {
[Link] = "Sorgulanyor...<br /> Ltfen bekleyiniz.";
$.post("/kn/", {
TakipNo: [Link],
csrfmiddlewaretoken: "{{ csrf_token }}"
}, function (data) {
[Link] = data;
});
} else {
[Link] = "Uygun bir arama kategorisi bulunamad!";
[Link](function () {
[Link]();
}, 0);
}
}
});
</script>

{% endblock %}

[Link]:
{% extends "[Link]" %}
{% block orta %}
<!--buras [Link] st -->
<div id='wrap'>
<div style="color:#ffffff;font-size:2.4vw;position:fixed;width:95%;top:20%;left:50%;-
webkit-transform:translate(-50%, -50%);transform: translate(-50%, -50%);">
Ne olacak bu Gztepe'nin hali?
</div>
</div>
<!--buras [Link] alt -->
{% endblock orta %}

[Link] de bir deiiklik yapmadk.

[Link]

Ana sayfa arldnda [Link] de bulunan iki blockta ki kodlar


[Link] deki gerekli yerlere eklenecek ve sayfamz tam olarak
yklenecek ama test linki arldnda [Link] deki tek block
olduu iin sadece bu block eleecek. sterseniz jsozel blounu
ekleyip iini bo ta brakabilirsiniz.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
91
20 Ocak 2016

Django template tarafnda bir ok yardmc fonksiyon barndrr.


Bunlara gml etiketler yada filtreler deniyor.

nce hazr olan ve sk kullanacanz bir ka hazr etiketlere gz


atalm.

Etiketler {% ... %} karakterleri ile kullanlr.

Aslnda u ana kadar bir ka tane templatetags kullandk. for, block


extends ve tabi kapatmalar endfor, endblock.

Etiketler iin [Link] dosyasn kullanacam. Not eklinde


yazmaktansa ekran grntleri ile canl grmeniz daha iyi olur.

for: En ok kullacamz etikettir. Bir liste, szlk veya karakter


dizisinin ierii kadar dng yapar.

En basit kullanm hali aadaki gibidir.

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
92
[Link]:
{% extends "[Link]" %}
{% block orta %}
<p>Etiketler</p>
<ul>
{% for sayi in "123456" %}
<li>{{ sayi }}</li>
{% endfor %}
</ul>
{% endblock orta %}

[Link] de yaptn bir sorgunun (queryset) sonucunu ekranda


yazdrmak iin kullanacaksnz.

Hemen bir rnek verelim.

Hatrlarsanz bir servis formunu yazdrmak iin bir fonksiyon


oluturmutuk.

[Link]:
def sayfayiyazdir(request, idsi):
formdurumu = [Link](id = idsi)
formbilgileri = [Link](ServisFormu__id = idsi)
return render(request, '[Link]', {'formbilgileri': formbilgileri,
'formdurumu':formdurumu})

sayfayiyazdir fonksiyonu; yazdrmak istediimiz servis formunu id


ile eletirip, Urunler tablosunda filter ile tm urunleri alp
[Link] e gndermitik.

filter ile bize bir liste oluturdu ve bunu [Link] de for ile
dng yapp ekrana bastrmtk.

[Link]:
{% for k in formbilgileri %}
<tr>
<td>{{ [Link]|upper }} | {{ [Link]|upper }} | {{ [Link]|upper }}</td>
<td>{{ [Link]|upper }}</td>
<td>{{ [Link]|title }}</td>
<td>{% for kk in [Link] %}{{ kk|title }} {% endfor %}</td>
<td>{{ [Link] }}</td>
</tr>
{% endfor %}

Aslnda burada hazr bir templatetags (template etiketi) kullanm


olduk.

Eer dngye sokulmak istenen dizinin ierii bo ve uyar


verdirmek istersek empty kullanabiliriz.
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
93
if: bir koul kullanmamz gerektiinde yani bir elemenin olup
olmad olmadna gre ynlendirme yapmamz salar. Aslnda
zaten bir ok yerde if i kullanyoruz. Template dosyalarnda
kullanm ise;

{% if "muslu" in "mslm" %}
iinde geiyor
{% else %}
iinde gemiyor
{% endif %}

yada

{% if "emir" == "cemir" %}
<p>cem + emir = cemir</p> <b>ama</b> emir; cemir demek deil.
{% endif %}

Ama oklu koullarda if kullanmna dikkat etmek gerekir.

{% if a > b > c %} yerine {% if a > b and b > c %} olarak


kullanlmal

comment: adndan da anlalaca gibi not almak iin kullanlr.


Taraycya gnderilmez. Sadece html (xml) dosyanz da gzkr.
ie yorum satr kullanamayz.

[Link]:
{% extends "[Link]" %}
{% block orta %}
<div id='wrap'>
<div style="color:#ffffff;font-size:2.4vw;position:fixed;width:95%;top:20%;left:50%;-
webkit-transform:translate(-50%, -50%);transform: translate(-50%, -50%);">
<p>Etiketler</p>

{% comment "Balk" %}
Buras html kaynak kodunda gzkmez. lerisi iin not olarak kullanlacak.
{% endcomment %}

</div>
</div>
{% endblock orta %}

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
94
cycle: Listedeki dng kadar devir eder yani srayla otomatik
metin oluturur. Burada class iin kullanld.

123456 yerine siz [Link] den gelen listeyi kullanabilirsiniz.


[Link]:
<!DOCTYPE HTML>
<html>
<head>
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><![endif]-->
<meta charset="utf-8">
<title>zmir Teknik Servis, Servis Formu kontrol, durum renme |
[Link]</title>
<meta name="description" content="zmir Teknik Servis, Servis Formu kontrol, durum
renme"/>
<link rel="canonical" href="[Link]
<link href='[Link] rel='stylesheet'
type='text/css'>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" href="/media/[Link]">
<link rel="stylesheet" href="/media/[Link]">
<style>
body {
margin: 0px;
background: #fff;
}
.dis {
width: 100%;
position: fixed;
top: 0px;
}
.sabitust {
height: 50px;
background: #F0F0F0;
width: 100%;
margin: 0px auto;
line-height: 50px;
}
.orta {
width: 100%;
margin: 70px auto;
}
.sabitalt {
position: fixed;
left: 0px;
bottom: 0px;
height: 40px;
width: 100%;
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
95
background: #C9F0DD;
z-index: 9999;
line-height: 40px;
}
</style>

</head>
<body>
<div class="dis">
<div class="sabitust">
<p><a href="/">Ana Sayfa</a> | <a href="/test/">Test</a></p>
</div>
<div class="orta">
{% block orta %}{% endblock orta %}
</div>
<div class="sabitalt">Sabit Alt</div>
</div>
<script src="/media/[Link]"></script>
<script src="/media/[Link]"></script>
{% block jsozel %}{% endblock jsozel %}
</body>
</html>

[Link]:
{% extends "[Link]" %}
{% block orta %}
<style>
.sari {
background-color: yellow;
font-size: 64pt;
}
.kirmizi {
background-color: red;
font-size: 64px;
}
.gri {
background-color: gray;
font-size: 64px;
}
</style>
<p>Etiketler</p>
<table>
<tr>
{% for o in "123456" %}
<td class="{% cycle 'sari' 'kirmizi' %}">
{{ o }}
</td>
{% endfor %}
</tr>
<tr>
{% for o in "123456789" %}
<td class="{% cycle 'gri' 'kirmizi' 'sari' %}">
{{ o }}
</td>
{% endfor %}
</tr>
</table>
{% endblock orta %}

[Link]

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
96
Ekran kts:

now: Anlk tarih ve saatin gsterilecei etiket. Sayfann yklendii


an gsterir.
{% now "jS F Y H:i" %}

widthratio: Oranlama yapmak iin kullanabilirsiniz. Kdv almak gibi


ama sonu kusuratl olduunda yukarya tamamlayacaktr.
{% widthratio a b c %} = (a / b) * c

{% widthratio 10 20 100 as sonuc %}


{{ sonuc }}

width: Bir veya daha fazla deeri tek seferde tanmlayp daha
sonrada kullanabilmek iin.

Bu rnekleri daha iyi anlamak iin [Link] dosyamza [Link]


den list, string ve integer deerleri gnderelim.

[Link]:
..
url(r'^test/$', test),
# url(r'^test/$',TemplateView.as_view(template_name="[Link]")),
..

olarak deitirelim.

[Link]:
def test(request):
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
97
list1 = ['muslu', 'yuksektepe']
list2 = ['digerliste1', 'digerliste2']
string = "bu bir string"
integer = 35

return render(request, '[Link]', {


'list1': list1,
'list2':list2,
'string':string,
'integer':integer
},
)

[Link]:
{% block orta %}
<p>Etiketler</p>
<br/><br/><br/><br/>
{% with yeniliste=list1 %}
{{ yeniliste }}
{% endwith %}
<br/>
{% with bubirke1ime=string %}
{{ bubirke1ime }}
{% endwith %}
<br/>
{% with rakam=integer %}
Gelen tam say: {{ rakam }} ve 10 ile toplatyoruz. Toplam: {{ rakam|add:"10" }}
{% endwith %}
<br/>
<br/>
{% with yeniliste=list1 digerlistem=list2 %}
{{ yeniliste }}, {{ digerlistem }}
{% endwith %}
{% endblock orta %}

olarak dosyalar gncelleyelim.

Test etmek iinse; ./[Link] runserver

[Link]
spaceless: html kodlarndaki beyaz alanlar temizler.
{% spaceless %}
<p>

<a href="/">Ana Sayfa</a>

</p>
{% endspaceless %}

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
98
verbatim: Django kodlar paylamak istediinizde bu etiketi
kullanabilirsiniz.
{% verbatim %}
{% if ivir === zivir %}
{% extends "[Link]" %}
{% endverbatim %}

Gml etiketler konusu aa yukar byle. Yani hazr


fonksiyonlarla ilemler yaptrabiliyorsunuz. Birde gml
filtrelerden bahsetmitik imdi onlara bakalm.

{{ |*** }} gibi kullanlyor.

Mesela;

add: Eer belirttiiniz deer integer ( tam say ) ise toplama ilemi,
liste ise eleman ekleme, kelime ( string ) ile rakam ileminde ise
kelime ekleme olarak kullanlabilir. Width etiketinde rnek olarak
kullandk.
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
99
{{ 6|add:"3" }}
<br/>
{{ "muslu"|add:"yksektepe" }}
<br/>
{{ "muslu"|add:"3" }}
<br/>
{{ liste|add:digerliste }}

9
musluyksektepe
muslu3
['muslu', 'yuksektepe', 'eklenendeger1', 'eklenendeger2']

21 Ocak 2016

addslashes: Kullanlacak deer de ' iareti geiyor ise sql sorgu, xml
yada csv lerde sorun yaanabilir. rnek olarak muslu'nun ya
ka? cmlesi sql komutu olsayd ' iareti yznden hata alrdk
yada cvs dosyasna kartlacak olursa hata alrz.
addslashes etiketi ise bu ' iaretinden nce \ ekleyerek hata
alnmasn engeller.

rnek:
[Link]:
hikaye = Kelolan'n kel kafasna sa ektirmek iin...
[Link]:
{{ hikaye|addslashes }}
Kelolan\'n kel kafasna sa ektirmek iin...

capfirst: lem yaplacak deer bir kelime veya cmle ise sadece
ilk harfi bytr.
[Link]:
{{ string }}
<br/>
{{ string|capfirst }}

bu bir string
Bu bir string

title: Her kelimenin ilk harflerini byk harfe evirir.


[Link]:
{{ string }}
<br/>
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
100
{{ string|capfirst }}

bu bir string
Bu bir string

upper: Cmlenin tm harflerini byk harfe evirir.


[Link]:
{{ string }}
<br/>
{{ string|upper }}

bu bir string
BU BIR STRING

lower: Cmlenin (rakam da ierebilir) tm harflerini kk harfe


evirir.
[Link]:
{{ string }}
<br/>
{{ string|lower }}

bu bir string
bu bir string

cut: Cmledeki (rakam da ierebilir) istenilen karakterleri silir


[Link]:
{{ string }}
<br/>
{{ string|cut:'i' }}
<br/>
{{ integer|cut:'3' }}

bu bir string
bu br strng
5

oklu kullanm iin:


{{ string|title|cut:' ' }}
BuBirString

default: Bir string, integer yada listenin dngdeki deeri (bo),


None veya False ise sabit deer atamak iin kullanlr. rnein bir
listemiz var ve iinde bo geilmi bir alan var.

default_if_none: Eer gnderilen yada dngdeki deer sadece


None ise bu eletirme alr.

Bu deerleri test edebilmemiz iin [Link] dosyamzda


listelerimizi gncelleyelim.

[Link]:
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
101
def test(request):
list1 = ['muslu', 'yuksektepe', '', False]
list2 = ['digerliste1', 'digerliste2', None]

...

[Link]:
{% extends "[Link]" %}
{% block orta %}
<p>Etiketler</p>
<br/><br/><br/><br/>
<ul>
{% for k in list1 %}
<li>{{ k|default:"default deeri deitirildi" }}</li>
{% endfor %}
</ul>
<ul>
{% for k in list2 %}
<li>{{ k|default_if_none:"None idi" }}</li>
{% endfor %}
</ul>
{% endblock orta %}

muslu
yuksektepe
default deeri deitirildi
default deeri deitirildi
digerliste1
digerliste2
None idi

first: Listenin ilk deerini gsterir.


last: Listenin son deerini gsterir.
{% extends "[Link]" %}
{% block orta %}
<p>Etiketler</p>
<br/><br/><br/><br/>
{{ list1|first }}
<br/>
{{ list1|last }}
{% endblock orta %}

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
102
divisibleby: Tam say olarak kullanlan deerin tam olarak blnp
blnemediinin kontrol
[Link]:
{{ integer|divisibleby:"3" }}

Alnabilecek hatalar:

invalid literal for int() with base 10: 'bu bir string'
string deeri blme ileminde kullandnz.

lenght_is: Listenin deer saysnn kontroln yapar.

[Link]:
{% extends "[Link]" %}
{% block orta %}
<p>Etiketler</p>
<br/><br/><br/><br/>
{{ list1|length_is:"4" }}
<br/>
{{ list2|length_is:"5" }}
<br/>
{% if not list2|length_is:"5" %} list2 deki eleman says 5 deilmi {% else %} eleman
says e {% endif %}
{% endblock orta %}

random: listeden rastgele deer dndrr.

[Link]:
{% extends "[Link]" %}
{% block orta %}
<p>Etiketler</p>
<br/><br/><br/><br/>
"{{ list1|random }}"
{% endblock orta %}

slice: Listeden istenilen aralkta deerleri arr. Tabi ki for ile


dngde kullanlabilir.

[Link]:
{% extends "[Link]" %}
{% block orta %}
<p>Etiketler</p>
<br/><br/><br/><br/>
{{ list1 }}
<br/>
[0:2]
<br/>
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
103
{{ list1|slice:"0:2" }}
<br/><br/>
{{ list2 }}
<br/>
[1:4]
<br/>
{{ list2|slice:"1:4" }}
{% endblock orta %}

Ekran kts:

['muslu', 'yuksektepe', '', False]


[0:2]
['muslu', 'yuksektepe']
['digerliste1', 'digerliste2', None]
[1:4]
['digerliste2', None]

striptags: xHTML karakterlerini temizler:

rnek:
{{ "<p><a href='/'>Ana Sayfa</a> | <a href='/test/'>Test</a></p>"|striptags }}
{{ htmlkodlar|striptags }}

Bir blog sitesinde haberlerin bir ksmn gstermek istersek


aadaki filtrelerden birini kullanabiliriz.

truncatechars_html: Deerin html kodlar dahil ederek istenilen


karakter kadarn gsterip ... ile devam ettirir.

truncatechars: Deerde istenilen karakter kadarn gsterir ... ile


devam ettirir.
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
104
truncatewords: Deerdeki kelimelerin istenilen kadarn gsterir ve
yine ... ile devam ettirir.

{{ string|truncatechars:6 }}<br/><br/>
{{ string|truncatechars_html:6 }}<br/><br/>
{{ string|truncatewords:2 }}<br/><br/>
{{ string|truncatewords_html:2 }}<br/><br/>

make_list: Deeri listeye evirir.

[Link]:
{% extends "[Link]" %}
{% block orta %}
<p>Etiketler</p>
<br/><br/><br/><br/>
{{ string|make_list }}
<br/><br/>
{% for k in integer|make_list %}
{{ k }}<br/>
{% endfor %}
{% endblock orta %}

kts:

[u'b', u'u', u' ', u'b', u'i', u'r', u' ', u's', u't', u'r', u'i',
u'n', u'g']

3
5

urlize: Deer iinde https:// http:// www. ile balayan kelimeleri


sonunda bilinen top level domainler var ise otomatik link oluturur
ve rel="nofollow" ekler.

.com, .net, .org, .edu, .gov, .int, .mil

[Link]:
{% extends "[Link]" %}
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
105
{% block orta %}
<p>Etiketler</p>
<br/><br/><br/><br/>
{{ "[Link] }}
<br/><br/>
{{ "[Link] }}
<br/><br/>
{{ "[Link]"|urlize }}
<br/><br/>
{{ "[Link]"|urlize }}
<br/><br/>
{{ "djangoturkiye"|urlize }}
<br/><br/>
{{ "[Link]"|urlize }}
<br/><br/>
.com, .net, .org, .edu, .gov, .int, .mil
{% endblock orta %}

html kts:
<div class="orta">

<p>Etiketler</p>

<br/><br/><br/><br/>
<a href="[Link] rel="nofollow">[Link]
<br/><br/>

<a href="[Link] rel="nofollow">[Link]


<br/><br/>

<a href="[Link] rel="nofollow">[Link]</a>


<br/><br/>

[Link]
<br/><br/>

djangoturkiye
<br/><br/>

<a href="[Link] rel="nofollow">[Link]</a>


<br/><br/>
.com, .net, .org, .edu, .gov, .int, .mil

</div>

wordcount: sminden de anlalaca gibi kelime saysn gsterir.


{{ "[Link] }}<br/>

{{ "www djangoturkiye com"|wordcount }}

Muslu YKSEKTEPE 2016


[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
106
Muslu YKSEKTEPE 2016
[Link] | [Link]
Ba Hesab: TR03 0006 2000 7500 0006 6675 10
107

You might also like