Django Statik Dosyalarla Çalışma

Django projelerinde sadece Python kodu yazmak yeterli değildir. Web uygulamalarının tasarımı için CSS, JavaScript, resim dosyaları, fontlar gibi dosyalar kullanılır. İşte bu dosyalara statik dosyalar (static files) denir.


1️⃣ Statik Dosya Nedir?

Statik dosyalar değişmeyen dosyalardır:

  • CSS dosyaları

  • JavaScript dosyaları

  • Resimler (jpg, png, svg)

  • Font dosyaları

Örneğin:

  • style.css

  • main.js

  • logo.png


2️⃣ Django’da Statik Dosya Mantığı

Django statik dosyaları özel bir sistemle yönetir. Bunun için:

  • STATIC_URL

  • STATICFILES_DIRS

  • STATIC_ROOT

ayarlarını kullanır.


3️⃣ settings.py Ayarları

settings.py dosyasını açın.

STATIC_URL = 'static/'

STATICFILES_DIRS = [
    BASE_DIR / "static",
]

STATIC_ROOT = BASE_DIR / "staticfiles"

Açıklama:

AyarNe İşe Yarar
STATIC_URLTarayıcıya sunulan URL yolu
STATICFILES_DIRSGeliştirme sırasında kullanılan klasör
STATIC_ROOTProduction ortamında toplanan dosyalar

4️⃣ Proje Dizin Yapısı

Örnek proje yapısı:

proje/
│
├── static/
│   ├── css/
│   │   └── style.css
│   ├── js/
│   │   └── main.js
│   └── img/
│       └── logo.png
│
├── templates/
│   └── index.html
│
└── manage.py

5️⃣ Template İçinde Static Kullanımı

HTML dosyasında statik dosya kullanmak için:

{% load static %}

CSS Bağlama

<link rel="stylesheet" href="{% static 'css/style.css' %}">

JavaScript Bağlama

<script src="{% static 'js/main.js' %}"></script>

Resim Kullanımı

<img src="{% static 'img/logo.png' %}" alt="Logo">

⚠ ÖNEMLİ: {% load static %} yazmayı unutursanız hata alırsınız.


6️⃣ Uygulama İçinde Static Kullanımı (App Bazlı)

Her uygulamanın içinde ayrı static klasörü olabilir.

blog/
│
├── static/
│   └── blog/
│       └── style.css

Template içinde kullanım:

<link rel="stylesheet" href="{% static 'blog/style.css' %}">

Django otomatik olarak uygulama içindeki static klasörlerini bulur.


7️⃣ Geliştirme Ortamında Statik Dosyalar

DEBUG=True iken Django statik dosyaları otomatik sunar.

Yani ekstra ayar yapmadan çalışır:

python manage.py runserver

8️⃣ Production Ortamında collectstatic

Canlı sunucuya geçerken Django tüm statik dosyaları tek klasörde toplar.

Komut:

python manage.py collectstatic

Bu komut:

  • Tüm app içindeki static dosyalarını

  • STATICFILES_DIRS içindekileri

  • STATIC_ROOT klasörüne kopyalar

Production ortamda web sunucusu (örneğin Nginx) bu klasörü servis eder.


9️⃣ Örnek Mini Uygulama

style.css

body {
    background-color: #f4f4f4;
    font-family: Arial;
}

h1 {
    color: darkgreen;
}

index.html

{% load static %}
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
    <h1>Django Statik Dosya Örneği</h1>
</body>
</html>

Çalıştırdığınızda CSS uygulanacaktır.


🔟 En Sık Yapılan Hatalar

❌ 1. {% load static %} unutmak

Çözüm: Template başına ekleyin.

❌ 2. STATICFILES_DIRS yanlış tanımlamak

BASE_DIR doğru olmalı.

❌ 3. collectstatic çalıştırmamak

Production ortamda mutlaka çalıştırılmalı.


1️⃣1️⃣ Media Dosyaları ile Karıştırmayın

Statik dosya ≠ Kullanıcı yüklemeleri

StaticMedia
CSS, JS, LogoKullanıcı profil resmi
DeğişmezDinamik

Media için ayrı ayarlar gerekir (MEDIA_URL, MEDIA_ROOT).


🎯 Özet

Django statik dosya sistemi:

  1. static klasörü oluşturulur

  2. settings.py ayarlanır

  3. Template içinde {% load static %} kullanılır

  4. Production’da collectstatic çalıştırılır


Django'da statik dosyalar (CSS, JavaScript, resimler, fontlar vb.) uygulamanızın "kıyafetleridir". Django'nun statik dosyaları yönetme mantığı ilk başta biraz karmaşık gelebilir, ancak temel yapıyı anladığınızda oldukça mantıklı ve güçlüdür.



Bir web sitesi sadece HTML'den ibaret değildir. Tasarımı güzelleştirmek için CSS'e, etkileşim katmak için JavaScript'e ve görselleştirmek için resimlere ihtiyaç duyarız. Django'da bu tür dosyalara Statik Dosyalar (Static Files) adı verilir.

Bu rehberde, Django projelerinize statik dosyaları nasıl ekleyeceğinizi ve yöneteceğinizi adım adım inceleyeceğiz.

1. Temel Ayarlar (settings.py)

İlk olarak Django'ya statik dosyalarımızın nerede olduğunu ve onlara hangi URL üzerinden erişeceğini söylemeliyiz. Projenizin ana dizinindeki settings.py dosyasını açın ve şu ayarları bulun (veya ekleyin):

Python
# settings.py

# Statik dosyalara tarayıcıdan erişmek için kullanılacak URL ön eki.
STATIC_URL = 'static/'

# Django'nun statik dosyaları arayacağı ek klasörler.
# Proje ana dizininde 'static' adında bir klasör oluşturduğumuzu varsayıyoruz.
STATICFILES_DIRS = [
    BASE_DIR / 'static',
]

Not: STATIC_URL web sitenizin adres çubuğunda görünecek yoldur (örneğin: site.com/static/css/style.css). STATICFILES_DIRS ise Django'nun dosyaları fiziksel olarak bilgisayarınızda arayacağı yerdir.

2. Klasör Yapısını Oluşturma

settings.py dosyasında belirttiğimiz gibi, proje ana dizininde (manage.py dosyasının bulunduğu yer) static adında bir klasör oluşturun. Düzenli çalışmak için bu klasörün içine alt klasörler eklemeniz iyi bir pratiktir:

Plaintext
benim_projem/
├── manage.py
├── benim_projem/
│   ├── settings.py
│   └── urls.py
├── static/                <-- Burayı oluşturun
│   ├── css/
│   │   └── style.css      <-- CSS dosyanız
│   ├── js/
│   │   └── script.js      <-- JS dosyanız
│   └── images/
│       └── logo.png       <-- Resim dosyanız
└── templates/
    └── index.html

3. Şablonlarda (Templates) Statik Dosyaları Kullanma

Dosyalarımızı yerleştirdikten sonra, sıra onları HTML şablonlarımızda çağırmaya geldi. Django'da statik bir dosyayı çağırmak için özel şablon etiketleri (template tags) kullanırız.

HTML dosyanızın (örneğin index.html) en üstüne şu satırı ekleyerek statik dosya etiketlerini yükleyin:

HTML
{% load static %}

Artık {% static 'dosya_yolu' %} etiketini kullanarak dosyalarınızı çağırabilirsiniz. İşte tam bir örnek:

HTML
{% load static %}
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <title>Django Statik Dosya Eğitimi</title>
    
    <link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>

    <h1>Django'ya Hoş Geldiniz!</h1>
    
    <img src="{% static 'images/logo.png' %}" alt="Site Logosu">

    <script src="{% static 'js/script.js' %}"></script>
    
</body>
</html>

4. Geliştirme (Development) vs. Canlı Ortam (Production)

Statik dosyalar konusunda Django'ya yeni başlayanların en çok kafasını karıştıran nokta burasıdır.

  • Geliştirme Ortamında (DEBUG = True): Kendi bilgisayarınızda çalışırken python manage.py runserver komutunu kullandığınızda, Django statik dosyaları sizin için otomatik olarak bulur ve sunar.

  • Canlı Ortamda (DEBUG = False): Sitenizi gerçek bir sunucuya yüklediğinizde Django, güvenlik ve performans nedenleriyle statik dosyaları kendi başına sunmaz. Nginx veya Apache gibi bir web sunucusunun bu işi yapması gerekir.

Canlı Ortam İçin collectstatic Komutu

Canlı ortama geçerken tüm uygulamalarınızdaki (örneğin admin panelinin CSS'leri dahil) ve STATICFILES_DIRS içindeki tüm statik dosyaları tek bir yerde toplamanız gerekir.

Bunun için settings.py dosyasına şunu eklersiniz:

Python
# Dosyaların toplanacağı ana dizin (Genellikle canlı sunucuda kullanılır)
STATIC_ROOT = BASE_DIR / 'staticfiles'

Ve ardından terminalde şu komutu çalıştırırsınız:

Bash
python manage.py collectstatic

Bu komut, her yerdeki statik dosyaları alır ve staticfiles adındaki klasöre kopyalar. Sunucunuzu da (Nginx vb.) doğrudan bu klasördeki dosyaları ziyaretçilere gösterecek şekilde yapılandırırsınız.


Özetle; CSS, JS veya resim eklemek istediğinizde:

  1. Proje dizininde static klasörüne dosyanızı koyun.

  2. HTML dosyanızın en üstüne {% load static %} yazın.

  3. Dosyayı {% static 'yol/dosya_adi.uzanti' %} şeklinde çağırın.

🌙 Django – Ramazan Temalı Statik Tasarım Uygulaması

Bu çalışmada Django projen için Ramazan ayına özel modern ve şık bir statik tasarım hazırlıyoruz.

İçerik:

  • Özel Ramazan arka plan tasarımı

  • Hilal animasyonu

  • Altın tonlu başlık stili

  • Kart tasarımı (İftar – Sahur Bilgisi)

  • Responsive (mobil uyumlu) yapı

Bu örnek 11. sınıf seviyesine uygun ama görsel olarak profesyonel görünecek şekilde hazırlanmıştır.


📁 1️⃣ Proje Klasör Yapısı

proje/
│
├── static/
│   ├── css/
│   │   └── ramazan.css
│   ├── js/
│   │   └── ramazan.js
│   └── img/
│       └── mosque.png
│
├── templates/
│   └── index.html
│
└── manage.py

⚙ 2️⃣ settings.py Ayarı

STATIC_URL = 'static/'

STATICFILES_DIRS = [
    BASE_DIR / "static",
]

🎨 3️⃣ Ramazan CSS Tasarımı (ramazan.css)

body {
    margin: 0;
    padding: 0;
    background: linear-gradient(to bottom, #0f2027, #203a43, #2c5364);
    font-family: 'Segoe UI', sans-serif;
    color: white;
    text-align: center;
}

/* Üst Başlık */
.header {
    padding: 40px 20px;
}

.header h1 {
    font-size: 40px;
    color: gold;
    text-shadow: 0 0 15px rgba(255, 215, 0, 0.7);
}

/* Hilal */
.moon {
    width: 120px;
    height: 120px;
    background: radial-gradient(circle at 40% 40%, #fff, #ddd);
    border-radius: 50%;
    position: relative;
    margin: 20px auto;
}

.moon::after {
    content: "";
    width: 120px;
    height: 120px;
    background: #203a43;
    border-radius: 50%;
    position: absolute;
    left: 25px;
}

/* Kart Tasarımı */
.card {
    background: rgba(255, 255, 255, 0.1);
    margin: 20px auto;
    padding: 25px;
    width: 300px;
    border-radius: 15px;
    backdrop-filter: blur(8px);
    box-shadow: 0 0 20px rgba(255, 215, 0, 0.3);
    transition: 0.3s;
}

.card:hover {
    transform: scale(1.05);
}

.card h2 {
    color: gold;
}

⚡ 4️⃣ JavaScript (ramazan.js)

document.addEventListener("DOMContentLoaded", function() {
    console.log("Ramazan Temalı Site Hazır 🌙");
});

🖼 5️⃣ HTML Template (index.html)

{% load static %}
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <title>Ramazan Özel</title>
    <link rel="stylesheet" href="{% static 'css/ramazan.css' %}">
</head>
<body>

    <div class="header">
        <h1>🌙 Ramazan Ayı Mübarek Olsun</h1>
        <div class="moon"></div>
    </div>

    <div class="card">
        <h2>🕌 İftar Vakti</h2>
        <p>19:12</p>
    </div>

    <div class="card">
        <h2>🌅 Sahur Vakti</h2>
        <p>05:03</p>
    </div>

    <script src="{% static 'js/ramazan.js' %}"></script>
</body>
</html>

✨ Görsel Sonuç

Bu tasarımda:

  • Gece mavisi degrade arka plan

  • Parlayan altın başlık

  • CSS ile yapılmış hilal şekli

  • Cam efekti (glassmorphism) kart tasarımı

  • Hover animasyonu

Profesyonel bir Ramazan teması oluşur.


🌙 Django – Bootstrap 5 ile Modern Ramazan Teması

Şimdi tasarımı bir üst seviyeye taşıyoruz 🚀
Bootstrap 5 kullanarak modern, responsive ve profesyonel bir Ramazan teması hazırlıyoruz.

Bu tasarımda:

  • 🌙 Koyu gece teması

  • ✨ Altın detaylar

  • 📱 Tam responsive yapı

  • 🎨 Bootstrap 5 grid sistemi

  • 💎 Cam efekti kartlar

  • ⏳ İftara kalan süre (JavaScript geri sayım)


📁 Klasör Yapısı

proje/
│
├── static/
│   ├── css/
│   │   └── ramazan.css
│   ├── js/
│   │   └── countdown.js
│
├── templates/
│   └── index.html

⚙ settings.py

STATIC_URL = 'static/'

STATICFILES_DIRS = [
    BASE_DIR / "static",
]

🎨 1️⃣ Özel CSS (static/css/ramazan.css)

body {
    background: linear-gradient(to bottom, #0f2027, #203a43, #2c5364);
    color: white;
    font-family: 'Segoe UI', sans-serif;
}

.navbar {
    background-color: rgba(0,0,0,0.6) !important;
}

.gold-text {
    color: gold;
    text-shadow: 0 0 10px rgba(255,215,0,0.7);
}

.glass-card {
    background: rgba(255,255,255,0.1);
    backdrop-filter: blur(10px);
    border-radius: 15px;
    box-shadow: 0 0 20px rgba(255,215,0,0.3);
    transition: 0.3s;
}

.glass-card:hover {
    transform: translateY(-5px);
}

.moon {
    width: 100px;
    height: 100px;
    background: radial-gradient(circle at 40% 40%, #fff, #ddd);
    border-radius: 50%;
    position: relative;
    margin: auto;
}

.moon::after {
    content: "";
    width: 100px;
    height: 100px;
    background: #203a43;
    border-radius: 50%;
    position: absolute;
    left: 20px;
}

⏳ 2️⃣ Geri Sayım JS (static/js/countdown.js)

function countdown() {
    const target = new Date();
    target.setHours(19, 12, 0); // İftar saati

    const now = new Date();
    const diff = target - now;

    if (diff > 0) {
        const hours = Math.floor(diff / (1000 * 60 * 60));
        const minutes = Math.floor((diff / 1000 / 60) % 60);
        const seconds = Math.floor((diff / 1000) % 60);

        document.getElementById("timer").innerHTML =
            hours + "s " + minutes + "d " + seconds + "sn";
    } else {
        document.getElementById("timer").innerHTML = "İftar vakti geldi 🌙";
    }
}

setInterval(countdown, 1000);

🖼 3️⃣ index.html (Bootstrap 5 Modern Versiyon)

{% load static %}
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <title>Ramazan Özel</title>

    <!-- Bootstrap 5 CDN -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">

    <link rel="stylesheet" href="{% static 'css/ramazan.css' %}">
</head>
<body>

<!-- Navbar -->
<nav class="navbar navbar-expand-lg navbar-dark">
  <div class="container">
    <a class="navbar-brand gold-text" href="#">🌙 Ramazan 2026</a>
  </div>
</nav>

<!-- Hero Section -->
<div class="container text-center mt-5">
    <h1 class="gold-text mb-4">Ramazan Ayı Mübarek Olsun</h1>
    <div class="moon mb-4"></div>
</div>

<!-- Kartlar -->
<div class="container mt-5">
    <div class="row justify-content-center g-4">

        <div class="col-md-4">
            <div class="glass-card p-4 text-center">
                <h3 class="gold-text">🕌 İftar Vakti</h3>
                <p class="fs-4">19:12</p>
                <p>⏳ Kalan Süre:</p>
                <h4 id="timer" class="gold-text"></h4>
            </div>
        </div>

        <div class="col-md-4">
            <div class="glass-card p-4 text-center">
                <h3 class="gold-text">🌅 Sahur Vakti</h3>
                <p class="fs-4">05:03</p>
            </div>
        </div>

    </div>
</div>

<!-- Footer -->
<footer class="text-center mt-5 p-4">
    <p class="gold-text">✨ Hayırlı Ramazanlar ✨</p>
</footer>

<script src="{% static 'js/countdown.js' %}"></script>
</body>
</html>

🎯 Bu Tasarımda Neler Öğrendin?

✅ Bootstrap 5 Grid sistemi
✅ Navbar kullanımı
✅ Responsive kart tasarımı
✅ Özel CSS ile cam efekti
✅ JavaScript ile geri sayım
✅ Django static sistemi



Yorumlar

Bu blogdaki popüler yayınlar

Pardus Üzerine Django Kurulumu

Python ile Web Geliştirme: Django App Oluşturma