logo
eng-flag

Django Notları ve İpuçları

İçindekiler

  1. Kurulum ve Ayarlar
  2. Proje Yapısı
  3. Modeller
  4. Görünümler
  5. URL'ler
  6. Şablonlar
  7. Formlar
  8. Yönetici Arayüzü
  9. Veritabanı İşlemleri
  10. Kimlik Doğrulama
  11. Statik Dosyalar
  12. Test Etme
  13. Dağıtım

Kurulum ve Ayarlar

Django'yu Yükle

pip install django

Yeni bir Django projesi oluştur

django-admin startproject projem
cd projem

Yeni bir uygulama oluştur

python manage.py startapp uygulamam

Geliştirme sunucusunu çalıştır

python manage.py runserver

Veritabanı tablolarını oluştur

python manage.py migrate

Proje Yapısı

  • manage.py: Yönetimsel görevler için komut satırı yardımcı programı
  • projem/: Proje dizini
    • __init__.py: Bu dizinin bir Python paketi olduğunu belirten boş dosya
    • settings.py: Proje ayarları/yapılandırması
    • urls.py: Proje URL tanımlamaları
    • asgi.py: ASGI uyumlu web sunucuları için giriş noktası
    • wsgi.py: WSGI uyumlu web sunucuları için giriş noktası
  • uygulamam/: Uygulama dizini
    • migrations/: Veritabanı taşımaları
    • __init__.py: Bu dizinin bir Python paketi olduğunu belirten boş dosya
    • admin.py: Yönetici arayüzü yapılandırması
    • apps.py: Uygulama yapılandırması
    • models.py: Veri modelleri
    • tests.py: Birim testleri
    • views.py: Görünüm fonksiyonları

Modeller

Bir model tanımla

from django.db import models

class Kisi(models.Model):
    ad = models.CharField(max_length=30)
    soyad = models.CharField(max_length=30)
    dogum_tarihi = models.DateField()
    
    def __str__(self):
        return f"{self.ad} {self.soyad}"

Bir örnek oluştur ve kaydet

kisi = Kisi(ad="Ahmet", soyad="Yılmaz", dogum_tarihi="1990-01-01")
kisi.save()

Veritabanını sorgula

# Tüm kişileri al
tum_kisiler = Kisi.objects.all()

# Kişileri filtrele
ahmetler = Kisi.objects.filter(ad="Ahmet")

# Tek bir kişi al
try:
    kisi = Kisi.objects.get(id=1)
except Kisi.DoesNotExist:
    print("Kişi bulunamadı")

Görünümler

Fonksiyon tabanlı görünüm

from django.shortcuts import render
from django.http import HttpResponse

def merhaba_dunya(request):
    return HttpResponse("Merhaba, Dünya!")

def kisi_detay(request, kisi_id):
    kisi = Kisi.objects.get(id=kisi_id)
    return render(request, 'kisi_detay.html', {'kisi': kisi})

Sınıf tabanlı görünüm

from django.views import View
from django.views.generic import ListView, DetailView

class KisiListesi(ListView):
    model = Kisi
    template_name = 'kisi_listesi.html'
    context_object_name = 'kisiler'

class KisiDetay(DetailView):
    model = Kisi
    template_name = 'kisi_detay.html'
    context_object_name = 'kisi'

URL'ler

URL yapılandırması (urls.py)

from django.urls import path
from . import views

urlpatterns = [
    path('', views.merhaba_dunya, name='merhaba_dunya'),
    path('kisi/<int:kisi_id>/', views.kisi_detay, name='kisi_detay'),
    path('kisiler/', views.KisiListesi.as_view(), name='kisi_listesi'),
    path('kisi/<int:pk>/', views.KisiDetay.as_view(), name='kisi_detay'),
]

Şablonlar

Temel şablon (kisi_detay.html)

<!DOCTYPE html>
<html>
<head>
    <title>{{ kisi.ad }} {{ kisi.soyad }}</title>
</head>
<body>
    <h1>{{ kisi.ad }} {{ kisi.soyad }}</h1>
    <p>Doğum Tarihi: {{ kisi.dogum_tarihi }}</p>
</body>
</html>

Kalıtım ile şablon

<!-- temel.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}Sitem{% endblock %}</title>
</head>
<body>
    {% block content %}
    {% endblock %}
</body>
</html>

<!-- kisi_detay.html -->
{% extends "temel.html" %}

{% block title %}{{ kisi.ad }} {{ kisi.soyad }}{% endblock %}

{% block content %}
    <h1>{{ kisi.ad }} {{ kisi.soyad }}</h1>
    <p>Doğum Tarihi: {{ kisi.dogum_tarihi }}</p>
{% endblock %}

Formlar

ModelForm

from django import forms
from .models import Kisi

class KisiFormu(forms.ModelForm):
    class Meta:
        model = Kisi
        fields = ['ad', 'soyad', 'dogum_tarihi']

Bir görünümde form kullanımı

from django.shortcuts import render, redirect
from .forms import KisiFormu

def kisi_olustur(request):
    if request.method == 'POST':
        form = KisiFormu(request.POST)
        if form.is_valid():
            form.save()
            return redirect('kisi_listesi')
    else:
        form = KisiFormu()
    return render(request, 'kisi_olustur.html', {'form': form})

Yönetici Arayüzü

Bir modeli yönetici sitesine kaydet

from django.contrib import admin
from .models import Kisi

admin.site.register(Kisi)

Yönetici arayüzünü özelleştirme

from django.contrib import admin
from .models import Kisi

@admin.register(Kisi)
class KisiAdmin(admin.ModelAdmin):
    list_display = ('ad', 'soyad', 'dogum_tarihi')
    list_filter = ('dogum_tarihi',)
    search_fields = ('ad', 'soyad')

Veritabanı İşlemleri

Taşıma oluştur

python manage.py makemigrations

Taşımaları uygula

python manage.py migrate

Ham SQL sorguları

from django.db import connection

def ozel_sql_sorgum():
    with connection.cursor() as cursor:
        cursor.execute("SELECT * FROM uygulamam_kisi WHERE dogum_tarihi > %s", [date(1990, 1, 1)])
        satir = cursor.fetchone()
    return satir

Kimlik Doğrulama

Kullanıcı giriş görünümü

from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect

def kullanici_giris(request):
    if request.method == 'POST':
        kullanici_adi = request.POST['kullanici_adi']
        sifre = request.POST['sifre']
        user = authenticate(request, username=kullanici_adi, password=sifre)
        if user is not None:
            login(request, user)
            return redirect('anasayfa')
        else:
            return render(request, 'giris.html', {'hata': 'Geçersiz kimlik bilgileri'})
    return render(request, 'giris.html')

Çıkış görünümü

from django.contrib.auth import logout
from django.shortcuts import redirect

def kullanici_cikis(request):
    logout(request)
    return redirect('anasayfa')

Giriş gerektiren dekoratör

from django.contrib.auth.decorators import login_required

@login_required
def korunmus_gorunum(request):
    return render(request, 'korunmus.html')

Statik Dosyalar

Statik dosyalar için ayarlar

# settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    BASE_DIR / "static",
]

Şablonlarda statik dosyaları kullanma

{% load static %}
<img src="{% static 'images/logo.png' %}" alt="Logo">
<link rel="stylesheet" href="{% static 'css/style.css' %}">

Test Etme

Bir test yazma

from django.test import TestCase
from .models import Kisi

class KisiModelTest(TestCase):
    def setUp(self):
        Kisi.objects.create(ad="Ahmet", soyad="Yılmaz", dogum_tarihi="1990-01-01")

    def test_kisi_olusturma(self):
        kisi = Kisi.objects.get(ad="Ahmet")
        self.assertEqual(kisi.soyad, "Yılmaz")

Testleri çalıştırma

python manage.py test

Dağıtım

Üretim için ayarlar

# settings.py
DEBUG = False
ALLOWED_HOSTS = ['www.ornek.com']

# Güvenlik ayarları
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

Statik dosyaları toplama

python manage.py collectstatic

Üretime hazır web sunucusu kullanma (örn. Gunicorn)

gunicorn projem.wsgi:application

2024 © Tüm hakları saklıdır - buraxta.com