Django Web Geliştirme

nt

Emekli
Katılım
21 Nisan 2023
Mesajlar
1,221
Selam!

Eğer web geliştirmeye merak saldıysanız, Django tam size göre.

Çok basit bir blog örneği veriyorum ama siz bir projenin içinde birden fazla app yapabilirsiniz

Django kullanan büyük firmalara örnek :OpenStockMate , Instagram, Pinterest, Spotify, NASA, Mozilla, The Washington Post, National Geographic, Redditgifts, Lego, Coursera, Booking.com, Red Hat, Udemy gibi liste daha uzar ...

Django, açık kaynaklı bir web çerçevesidir ve sizi karmaşık detaylardan koruyarak sadece kodunuza odaklanmanıza olanak tanır.

projelerinizi hızlı bir şekilde hayata geçirmenizi sağlayan bir dizi araç ve kütüphane sunar. MVC tasarım deseni sayesinde veritabanı işlemleri, kullanıcı arayüzü ve iş mantığı birbirinden ayrı tutulur, bu da kodunuzu daha düzenli hale getirir. Ayrıca, basit ve etkili bir templating sistemi ile HTML sayfalarınızı dinamikleştirebilirsiniz.

Yazmaya models den başlıyoruz her seferinde bu böyle olucak bu örnek için
her models girişinden sonra migrate ve migration komutlarını girebilir ya da tüm projeyi tamamlayıp yapabilirsiniz.
Ekran Görüntüsü - 2023-12-08 02-33-20.png


Model-View-Controller'ın kısaltmasıdır ve bir yazılım tasarım desenidir. Bu desen, bir uygulamanın tasarımını organize etmek ve geliştirmek için kullanılır. Model işin mantığını view görüntsünğ contoller da adı üstünde kontrolünü sağlar büyük projelerde karmaşık tasarım ekiplerine kolaylık sağlar.MVC deseninin temel amacı, uygulamanın her bir parçasını birbirinden bağımsız hale getirerek, değişikliklerin kolayca yapılabilmesini ve bakımın daha etkili olmasını sağlamaktır. Bu sayede, bir parçanın değiştirilmesi veya eklenmesi, diğer parçaları etkilemez.

Admin paneli ise gerçek bir hayat kurtarıcı! Otomatik olarak oluşturulan bu panel sayesinde veritabanınızı düzenlemek çocuk oyuncağı haline gelir.

Django'nun güvenlik odaklı tasarımı da sizi düşündürmekten uzaklaştırır. XSS, CSRF gibi güvenlik zafiyetleriyle baş etmek için otomatik önlemler alır ve size güvende olduğunuz hissini verir.

Eğer daha önce Django ile tanışmadıysanız, bu rehber size ilk adımlarınızda rehberlik edecek. Siz de bu sihirli çerçeve ile web geliştirmenin keyfini çıkarın!

Öncelikle django yu kuralım
Bash:
pip install django

Sırada projemizi oluşturmak var
Bash:
django-admin startproject proje
proje kısmını kendi projenizin adıyla değiştirin.

Django projeniz içinde çalışacak uygulamaları oluşturun. Örneğin, bir blog sitesi yapacaksanız, aşağıdaki gibi bir komut kullanabilirsiniz:
Bash:
cd proje
python manage.py startapp blog

Terminale yazdığımız"python manage.py startapp blog" komutu, belirttiğiniz proje adı (proje) altında bir blog uygulaması oluşturacaktır
buda gerekli dosyaları oluşturur
Bash:
proje/
├── blog/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations/
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── db.sqlite3#migrate kodları girdikten sonra oluşur
├── manage.py
└── proje/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    ├── asgi.py
    └── wsgi.py

Bu yapının ardından, yeni blog uygulamasını Django projesine dahil etmeyi unutmayın. Bunun için proje/settings.py dosyasını açın ve INSTALLED_APPS listesine 'blog' ekleyin:
Python:
#settings.py
INSTALLED_APPS = [
    'blog',
    #djangonun diger uygulamaları
    #güvenlik
    #adminhareketklerigibi bu dosyalar kendiliğinden oluşur size sadece ayaryapmak kalır
]

Veritabanı AyarlarıProjenizin ayar dosyasını açın (proje/settings.py) ve veritabanı ayarlarınızı düzenleyin. Varsayılan olarak, SQLite kullanabilirsiniz.
Python:
#settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / "db.sqlite3",
    }
}

Model OluşturmaUygulamanız içindeki models.py dosyasını açın ve veritabanınızın nasıl görüneceğini tanımlayın. Örneğin, bir blog gönderisi için:
Python:
#models.py
from django.db import models

class BlogPost(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField('date published')

Veritabanını GüncellemeTerminalde veya komut istemcisinde şu komutu kullanarak veritabanınızı oluşturun veya güncelleyin:
Bash:
python manage.py makemigrations
python manage.py migrate
Django Admin Panelini AyarlamaAdmin panelini kullanabilmek için admin.py dosyasında modelinizi kaydedin:
Python:
#admin.py
from django.contrib import admin
from .models import BlogPost

admin.site.register(BlogPost)
URL AyarlarıUygulamanız içindeki urls.py dosyasını oluşturun ve URL yönlendirmelerinizi tanımlayın.
Python:
#urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
Görünümleri (Views) OluşturmaUygulamanız içindeki views.py dosyasını açın ve sayfalarınızın görünümlerini tanımlayın.
Python:
#views.py
from django.shortcuts import render
from .models import BlogPost

def index(request):
    posts = BlogPost.objects.all()
    return render(request, 'index.html', {'posts': posts})
HTML ŞablonlarıUygulamanız içinde bir "templates" klasörü oluşturun ve HTML şablonlarınızı buraya ekleyin.
Bash:
cd proje_adı
mkdir templates
cd templates
Bu komutlar sırasıyla proje dizinine gidip, bir templates klasörü oluşturur ve bu klasöre geçiş yapar.
ardından html sayfanızı oluşturabilirsiniz basit bir örnek html yazıyorum
siz templates/base.html dosyasını VS Code içinde açın ve HTML içeriğini düzenleyin:
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}Ana Sayfa{% endblock %}</title>
</head>
<body>
    <header>
        <h1>{% block header %}Hoş Geldiniz{% endblock %}</h1>
    </header>
    <nav>
        <ul>
            <li><a href="{% url 'home' %}">Ana Sayfa</a></li>
            <li><a href="{% url 'about' %}">Hakkında</a></li>
        </ul>
    </nav>
    <main>
        {% block content %}{% endblock %}
    </main>
    <footer>
        <p>&copy; 2023 Django Blog</p>
    </footer>
</body>
</html>
Bu örnek base.html dosyasında, Django'nun templatelerinde kullanılan {% block %} etiketleri ile ana başlık (title), başlık (header), içerik (content) ve diğer bölümleri belirlemek için yer tutucular eklenmiştir.
Böylelikle db de yaptığınız değişiklikler yeni yazdığınız yazı örneğin otonom olarak gelip sayfada duracaktır

Aşağıdaki linkde tam bir hazine var django hakkında türkçe kaynak incelemenizi taviye ederim.
 
Son düzenleme:
Kullanıcı Kayıt ve Giriş Sistemi

genel olarak ORM tasarımını ve MVC mimarisini anladığınızı düşünüyorum aklınıza takılan yer olursa sorun lütfen ben eğitimci değilim dilim döndüğünce anlatmaya çalışıyorum.

kullanıcılar için db'ye bir model oluşturalım
Python:
# models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    # şehir, yaş, profil resmi, telefon numarası, vb.
    pass
Django'da kullanıcı kayıt ve giriş işlemleri için önceden tanımlanmış formları kullanabilirsiniz. Bu formları kullanmak için forms.py dosyasına şu kodu ekleyebilirsiniz:
Python:
# forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ('username', 'email')

class CustomAuthenticationForm(AuthenticationForm):
    class Meta:
        model = CustomUser
views.py dosyanızda kullanıcı kayıt ve giriş işlemlerini yönetmek için view fonksiyonları oluşturun:
Python:
# views.py
from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate
from .forms import CustomUserCreationForm, CustomAuthenticationForm

def register(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)
            login(request, user)
            return redirect('home')
    else:
        form = CustomUserCreationForm()
    return render(request, 'registration/register.html', {'form': form})

def user_login(request):
    if request.method == 'POST':
        form = CustomAuthenticationForm(request, request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request, user)
            return redirect('home') 
    else:
        form = CustomAuthenticationForm()
    return render(request, 'registration/login.html', {'form': form})

urls.py dosyanızda, oluşturduğunuz view fonksiyonlarını URL'lere yönlendirin(bu projenin değil app içindeki yani blog/urls.py dir :

Python:
# urls.py
from django.urls import path
from .views import register, user_login

urlpatterns = [
    path('register/', register, name='register'),
    path('login/', user_login, name='login'),
]

Son olarak, kullanıcı kayıt ve giriş sayfaları için şablonları oluşturun. templates klasörünüzde registration altında register.html ve login.html dosyalarını oluşturun.
(html kodlarını gpt ye yazdırıyorum ya da codewhisperer)
Örneğin, register.html:
HTML:
{% extends 'base.html' %}

{% block title %}Kayıt{% endblock %}

{% block content %}
    <h2>Kayıt Ol</h2>
    <form method="post" action="{% url 'register' %}">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Kayıt Ol</button>
    </form>
{% endblock %}
 
Son düzenleme:
Yorum Sistemi
models.py dosyanızda, yorumları temsil eden bir model oluşturun:
Python:
# models.py
from django.db import models
from django.contrib.auth.models import User

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    text = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    # İsteğe bağlı olarak, hangi modele bağlı olduğunu belirten bir GenericForeignKey ekleyebilirsiniz
    # content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    # object_id = models.PositiveIntegerField()
    # content_object = GenericForeignKey('content_type', 'object_id')
    # ya da her yoruma ayrı url belirleme slug ile

    def __str__(self):
        return f"{self.user.username} - {self.created_at}"

Bu model, yorumların kullanıcı, metin ve oluşturulma tarihini içerdiği basit bir yapıya sahiptir. İsteğe bağlı olarak, GenericForeignKey ekleyerek bu yorumları başka modellere de bağlayabilirsiniz.

Python:
# forms.py
from django import forms
from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['text']

views.py dosyanızda, yorum eklemek ve görüntülemek için görünümler oluşturun:

Python:
# views.py
from django.shortcuts import render, get_object_or_404, redirect
from .models import Comment
from .forms import CommentForm

def view_post(request, post_id):
    post = get_object_or_404(Post, pk=post_id)
    comments = Comment.objects.filter(post=post)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.user = request.user
            comment.post = post
            comment.save()
            return redirect('view_post', post_id=post_id)
    else:
        form = CommentForm()

    return render(request, 'view_post.html', {'post': post, 'comments': comments, 'form': form})

templates klasörünüzde, yorumları görüntülemek ve eklemek için şablonları oluşturun. Örneğin, view_post.html dosyanız şu şekilde olabilir:
HTML:
{% extends 'base.html' %}

{% block title %}{{ post.title }}{% endblock %}

{% block content %}
    <h2>{{ post.title }}</h2>
    <p>{{ post.content }}</p>

    <!-- Gönderi Yorumları -->
    <h3>Yorumlar</h3>
    {% for comment in comments %}
        <p>{{ comment.user.username }} - {{ comment.created_at }}</p>
        <p>{{ comment.text }}</p>
    {% endfor %}

    <!-- Yorum Formu -->
    <h3>Yorum Yap</h3>
    <form method="post" action="{% url 'view_post' post_id=post.id %}">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Yorum Yap</button>
    </form>
{% endblock %}
 
Son düzenleme:
Arama Fonksiyonu
Python:
# models.py
from django.db import models

class YourModel(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()

class SearchResult(models.Model):
    model_name = models.CharField(max_length=255)
    object_id = models.PositiveIntegerField()
    content = models.TextField()

Python:
# forms.py
from django import forms

class SearchForm(forms.Form):
    query = forms.CharField(label='Arama', max_length=100)

Python:
# views.py
from django.shortcuts import render
from .models import YourModel, SearchResult
from .forms import SearchForm

def search(request):
    query = request.GET.get('query')

    if query:
        model_results = YourModel.objects.filter(title__icontains=query) | YourModel.objects.filter(content__icontains=query)

        for result in model_results:
            SearchResult.objects.get_or_create(
                model_name=result.__class__.__name__,
                object_id=result.id,
                content=result.title#BAŞLIK YA DA İÇERİK OLARAK DEĞİŞTİRİN
            )
        search_results = SearchResult.objects.filter(content__icontains=query)

        return render(request, 'search_results.html', {'query': query, 'search_results': search_results})
    else:
        return render(request, 'search_results.html', {'query': query})


Son olarak Html Teşekkürler GPT
HTML:
{% extends 'base.html' %}

{% block title %}Arama Sonuçları{% endblock %}

{% block content %}
    <h2>Arama Sonuçları</h2>
    <p>Aranan: {{ query }}</p>

    {% if search_results %}
        <ul>
            {% for result in search_results %}
                <li>
                    {{ result.model_name }}:
                    <a href="{% url result.model_name|lower result.object_id %}">
                        {{ result.content }}
                    </a>
                </li>
            {% endfor %}
        </ul>
    {% else %}
        <p>Aradığınız kriterlere uygun sonuç bulunamadı.</p>
    {% endif %}
{% endblock %}
 
Son düzenleme:
4. Özel Sayfalar ve URL Yönlendirmesi:
 
5. Tema ve Stil Özelleştirmeleri:
 
10.Sosyal Medya Paylaşım Entegrasyonu
 
İleri Seviye
Bash:
# 1. API Geliştirme
# 2. Asenkron İşlemler
# 3. Veritabanı İşlemleri
# 4. Kullanıcı Yetkilendirme ve İzleme
# 5. GraphQL Kullanımı
# 6. Testler ve Sürekli Entegrasyon
# 7. Django Sinyalleri
# 8. Performans Optimizasyonları
# 9. CMS veya Wagtail Entegrasyonu
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,955
Mesajlar
118,789
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top