Django'nun MVT Mimarisi Nasıl Çalışır: Modellere, Görünümlere ve Şablonlara Derin Dalış


Django, üst düzey bir Python çerçevesidir. Sağlam web uygulamaları oluşturmada sadeliği ve verimliliği için popülerdir.

Django mimarisinin kalbinde Model-Görünüm-Şablon (MVT) modeli bulunur. Django'nun tüm gücünden yararlanmak istiyorsanız Modellerin, Görünümlerin ve Şablonların nasıl etkileşimde bulunduğunu iyi anlamak çok önemlidir.

İster Django veya acemi için tamamen yeni olun, bu makale bu bileşenlerin dinamik web uygulamaları oluşturmak için nasıl çalıştığını ve birbirleriyle nasıl etkileşime girdiğini gösteren kapsamlı bir rehber olarak hizmet edecektir.

Daha da anlaşılabilir hale getirmek için, bu bileşenlerin birbirine bağlanabilirliğini daha iyi anlamanıza yardımcı olacak basit bir uygulama oluşturacağız.

Zaten heyecanlıysanız hemen konuya girelim!

İşte kapsayacağız:

  • Önkoşullar

  • MVT mimarisi nedir?

  • Model Bileşeni

  • Görünüm bileşeni

  • Şablon Bileşeni

  • MVT İş Akışını Gösteren Diyagram

  • MVT'nin Gerçek Dünya Analojisi

  • Hepsini Bir Projede Bir araya Getirmek

  • Çözüm

Önkoşul

Takip etmek için:

  • İstemci-sunucu mimarisi de dahil olmak üzere web uygulamalarının nasıl çalıştığına dair temel anlayış.

  • Python'un temel bilgisi.

MVT Mimarisi Nedir?

MVT modeli, Django’nun bir web uygulamasının kod tabanını ve iş akışını düzenleme yaklaşımıdır. Bu mimariyi oluşturan bileşenler model, görünüm ve şablondur. Her bileşen belirli işlevleri gerçekleştirir ve daha sonra süreci yapmak için diğer bileşenlere aktarır.

Gerçekleştirdikleri belirli işlevlerle birlikte bileşenlere hızlıca göz atalım:

  • Model : Veri katmanı olarak da bilinir, verileri yönetir ve veritabanı ile etkileşime girer.

  • view : Mantık katmanı olarak da bilinir, aracı olarak işlev görür, mantığı işler ve veri akışını yönetir.

  • Şablon : Sunum katmanı olarak da bilinir, HTML içeriği kullanıcı arayüzünde oluşturur.

Artık bir Django uygulamasındaki bileşenler ve rolleri hakkında bir fikriniz olduğuna göre, her bileşene ve mimaride nasıl etkileşime girdiklerine kapsamlı bir şekilde bakacağız.

Model bileşeni

Modeller, bir Django uygulaması içindeki verilerin yapısını ve etkileşimini yöneterek, verilerin oynadığı kritik rol nedeniyle onları Django uygulamalarının temeli haline getirir.

Django modelleri, ilişkisel veritabanı ile Python kodu arasındaki boşluğu dolduran Nesne-İlişkisel Haritalama (ORM) adı verilen güçlü bir özellikten yararlanır. Python nesnelerini (sınıflarını) veritabanı tablolarına, niteliklerini sütunlara ve örnekleri bu tablolardaki satırlara dönüştürür.

ORM'nin büyük bir avantajı, SQL sorguları yazmak yerine Python nesnelerini kullanarak veritabanıyla etkileşime girmenize izin vermesidir. Bunu, izleyicinin anlaması için bir dili diğerine dönüştüren bir çevirmen olarak düşünün. Bu durumda ORM, Python kodunu veritabanının yürütebileceği SQL komutlarına çevirir (veya bunun tersi de geçerlidir).

Django modelleri, veritabanı ile ilgili tüm mantığı kapsar ve depolamak istediğiniz veriler için bir plan görevi gören veritabanınızın yapısını tanımlar.

Django Modelinin genel biçimi

Django'da her model belirli bir bildirim yöntemini izler. Bir model bildiriminin temel yapısı şöyledir:

class <model_name>(models.Model):
    <field_name> = models.<field_type>(<optional_field_characteristics>)

Şimdi parçalayalım:

  • class : Django'da bir model tanımlamak için kullanılan anahtar kelime.

  • Model_name : Modelin adı.

  • models.Model: model sınıfının miras aldığı temel sınıf.

  • field_name : Veritabanı sütununun adı.

  • field_type : Alanın charfield , boereanfield gibi tuttuğu veri türünü ifade eder.

  • Optional_field_characteristics : Alanın max_length , varsayılan gibi nasıl davrandığını daha fazla tanımlamak için kullanılır.

Model Örneği

Bu noktaya kadar modeller hakkında her şeyi bildiğimizden, Görev listesi için bir tane oluşturacağız. Genellikle görev başlığını, açıklamasını ve görevlerin tamamlanıp tamamlanmadığına ilişkin bir göstergeyi içerir.

class Task(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    completed = models.BooleanField(default=False)

Bu modelde:

  • Görev modelin adıdır.

  • Görev modelinin üç alanı vardır:

    • title: Maksimum 100 karakter uzunluğunda metni tutan bir CharField.

    • Açıklama : daha uzun metin için textField .

    • tamamlandı : true veya false değerini, false değerini depolayan Kod>.

Görünüm bileşeni

Django görünümleri, kullanıcı isteklerinin işlenmesinden ve yanıtları döndürmeden sorumludur. Model nesnelerden veri toplayarak, üzerinde mantıksal işlemler gerçekleştirerek (belirli kriterlere dayalı sorgular gibi) ve daha sonra verileri ekran için şablona geçirerek model ve şablon arasındaki köprü görevi görürler.

Görünümler, başvurunuzun karmaşıklığına ve gereksinimlerine bağlı olarak işlevler veya sınıf tabanlı olarak yazılabilir.

bir django görünümünün genel biçimi

İşte bir görünümün temel yapısı:

def <view_name>(request):
    # View Logic goes in here....
    return render(request, <template>, <context>)

Şimdi parçalayalım:

  • view_name : Görünüm işlevinin adı.

  • istek: İstemci tarafından Django sunucusuna gönderilen HTTP isteği, form gönderimleriyle veya bir düğmeye tıklanarak tetiklenebilir.

  • dönüş render : HTML yanıtını oluşturmak için kullanılır. Alar:

    • request: gelen istekle ilgili bilgileri içeren istek nesnesi.

    • Şablon : Oluşturulacak şablon dosyası.

    • bağlam : Şablonda sunulacak değişkenleri içerir, genellikle bir sözlük şeklinde gelir.

Örneği görüntüle

Görev Listemize devam edersek görünümümüz şöyle görünecektir:

def task_list(request):
    # Logic goes in here...
    return render(request, <template>, {'tasks': tasks})

Şablon bileşeni

Django şablonları, tarayıcıda son HTML çıktısının oluşturulmasından sorumludur. HTML ve Django'nun şablonlama dilinin bir kombinasyonunu kullanarak verilerin nasıl sunulması gerektiğini tanımlarlar.

Django şablon dili, şablon etiketlerini kullanmayı içerir { % %} şablon değişkenleri {{{}} HTML şablonunuza Django Modunu girin. Bu modda, görüşlerinizde tanımlanan değişkenlere erişebilir ve şablonunuzdaki kontrol yapılarını kullanabilirsiniz.

Şablonlar, kullanıcı arayüzünüzü daha iyi sunulabilir hale getirmek için CSS veya favori CSS çerçevelerinizden herhangi biri kullanılarak da stillendirilebilir.

şablon örneği

Şablonumuz Django’nun şablon diline sahip normal bir HTML dosyasıdır. Görev listesi şablonumuz şöyle görünür:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Task List</title>
</head>
<body>
    <h1>Task List</h1>
    <ul>
        {% for task in tasks %}
            <li>{{ task.title }} - {{ task.completed|yesno:"Done,Not Done" }}</li>
        {% empty %}
            <p>No tasks available.</p>
        {% endfor %}
    </ul>
</body>
</html>

Bu şablonda:

  • for Loop, görevleri listesindeki her bir görevi yineleyin (görüşümüzde bağlam olarak iletildiğini unutmayın).

  • Her görev için, görevin başlığını ve tamamlandı durumunu ("Bitti" veya "Bitmedi" olarak) verir.

  • görevler listesi boşsa, {% empty % bloğu "Kullanılabilir görev yok" diyen bir geri dönüş mesajı görüntüler.

MVT iş akışını gösteren diyagram

Bu şema, Django'nun MVT mimarisi içerisinde verilerin nasıl aktığını göstermektedir:

MVT'nin Gerçek Dünya Analojisi

Bir restorana gittiğinizi ve en sevdiğiniz yemeğin siparişini verdiğinizi hayal edin. Restoranın perde arkasında her yemeğin nasıl hazırlanması gerektiğini özetleyen bir tarif kitabı bulunuyor. Şef, yemeğinizi tam olarak sipariş ettiğiniz şekilde hazırlamak için tarifleri kullanır. Sunucu hazır olduğunda yemeği size şık bir şekilde teslim eder.

Tıpkı bir şefin yemeği oluşturmak için tarifi takip ettiği gibi, görünüm modeli verileri toplamak ve işlemek için kullanır. Son olarak, çanağı teslim eden sunucu gibi, şablon da nihai çıktının kullanıcıya net ve ilgi çekici bir formatta sunulmasını sağlar.

Hepsini bir projeye bir araya getirmek

Bu bölüm, baştan sona, makalede örnek olarak kullandığımız görev listesinin nasıl ayarlanacağınızı size yönlendirecektir. Sonunda, MVT mimarisi ile tam akışta fonksiyonel bir uygulamanız olmalıdır.

Python'u kurun

İlk olarak, Python'un kurulduğundan emin olun. En son Python sürümünü indirmek için Python’un resmi web sitesini ziyaret edebilirsiniz.

Django projesini ve uygulamasını kurun

Daha sonra Django'yu yükleyin. Pip kullanarak kurabilirsiniz:

pip install django

Bir klasör oluşturun ve onu favori kod düzenleyicinizde açın.

Terminalinizde aşağıdaki komutları arka arkaya çalıştırarak yeni bir Django projesi ve uygulaması oluşturun:

django-admin startproject myproject 
cd myproject
django-admin startapp myapp

Modeli Tanımlayın

myApp/Models.py :

from django.db import models

class Task(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    completed = models.BooleanField(default=False)

Bir Form Oluştur

Görev modeline dayanan bir Django formuna ihtiyacımız var, bu nedenle Django Modelform'u kullanarak bir tane oluşturacağız.

myApp , bir dosya oluşturun, forms.py> adını adlandırın ve bu kodu ekleyin:

from django import forms
from .models import Task

class TaskForm(forms.ModelForm):
    class Meta:
        model = Task
        fields = ['title', 'description', 'completed']

Bu kodda:

  • Görev .models 'dan içe aktarılır.

  • class TaskForm(forms.ModelForm): Bu, forms.ModelForm'un bir alt sınıfı olan TaskForm adında yeni bir sınıf oluşturur.

  • sınıf meta: : Django’nun Modelform tarafından form için yapılandırma sağlamak için kullanılan özel bir sınıftır. Meta sınıfı, Django'ya ilişkili modeli ve forma dahil edilecek alanları belirterek formun nasıl oluşturulacağını söyler.

  • model=Görev: formun temel aldığı modeli belirtir. Bu durumda form Görev modelini temel alır.

  • fields=['başlık', 'açıklama', 'tamamlandı'] : görev modelinden hangi alanların formda dahil edilmesi gerektiğini belirtir. Bu, hangi model alanlarının formda göründüğünü kontrol etmenizi sağlar ve modeldeki tüm alanlardan ziyade yalnızca belirli alanları içerecek şekilde özelleştirilebilir.

Görünümü Oluşturun

myapp/views.py dosyanıza şu kodu ekleyin:

from django.shortcuts import render,redirect
from .models import Task
from .forms import TaskForm

def task_list(request):
    tasks = Task.objects.all()    # Retrieve all tasks

    if request.method == 'POST':    # Handle form submissions
        form = TaskForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('task_list')  # Redirect to avoid duplicate submissions
    else:
        form = TaskForm()

    # Pass tasks and the form to the template
    return render(request, 'task_list.html', {'tasks': tasks, 'form': form})

Bu görünümde,

  • TaskForm, forms'tan içe aktarılmıştır.

  • Kod, istek yönteminin POST olup olmadığını kontrol ederek kullanıcının bir form gönderdiğini belirtir.

  • Yöntem post ise, gönderilen verileri ( request.post ) kullanarak bir görev formu örneği oluşturur.

  • Daha sonra form form.is_valid() kullanılarak doğrulanır ve geçerliyse form veritabanına kaydedilir.

  • Kaydedildikten sonra kullanıcı, mükerrer gönderimleri önlemek için görev listesi sayfasına yönlendirilir.

Şablonu Tanımlayın

myapp dizininizde bir templates klasörü oluşturun. Şablonlar klasörünün içinde bir dosya oluşturun ve onu task_list.html olarak adlandırın. Kullanıcı girişlerini toplayan ve bunları kullanıcı arayüzünde bir listede görüntüleyen bir form öğesi eklememiz gerekiyor.

task_list HTML dosyasında şunlar bulunur:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Task List</title>
</head>
<body>
    <h1>Task List</h1>
    <ul>
        {% for task in tasks %}
            <li>{{ task.title }} - {{ task.completed|yesno:"Done,Not Done" }}</li>
        {% empty %}
            <p>No tasks available.</p>
        {% endfor %}
    </ul>

    <h2>Add a New Task</h2>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Add Task</button>
    </form>
</body>
</html>

Eklenen form kodunda:

  • Veri göndermek için POST yöntemiyle bir HTML formu oluşturduk. CSRF saldırılarına karşı koruma sağlamak için bir {% csrf_token % içerir.

  • Form alanları, her alanı bir

    etiketi içinde görüntüleyen {{form.as_p}} kullanılarak oluşturulur.

  • Son olarak, kullanıcının form verilerini göndermesine olanak tanıyan "Görev Ekle" etiketli bir gönder düğmesi sağlanır.

Klasör yapısı

Bu noktaya ulaştıktan sonra uygulamanızı doğru şekilde yapılandırıp yapılandırmadığınızı kontrol etmeniz önemlidir. Klasör/dosya yapınız şu şekilde görünmelidir:

└── ?myproject
    └── ?myapp
        └── ?__pycache__
        └── ?migrations
        └── ?templates
            └── task_list.html
        └── __init__.py
        └── admin.py
        └── apps.py
        └── forms.py
        └── models.py
        └── tests.py
        └── urls.py
        └── views.py
    └── ?myproject
        └── ?__pycache__
        └── __init__.py
        └── asgi.py
        └── settings.py
        └── urls.py
        └── wsgi.py
    └── db.sqlite3
    └── manage.py

Projenin URL'sini yapılandırın

myproject/urls.py >'nize , URL'yi myApp 'inize ekleyin:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('myapp.urls')),
]

Uygulamayı proje ayarlarına ekleyin

myapp dosyanızı myproject/settings.py dosyanızdaki Yüklü uygulamalar listesine ekleyin:

INSTALLED_APPS = [
    'myapp',      # added our myapp app
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

Sunucuyu çalıştırın

Geçişi uygulayın ve şu komutları girerek sunucuyu çalıştırın:

python manage.py migrate

python manage.py runserver

Uygulamanızı test etmek için tarayıcınızda http://127.0.0.1:8000/ adresini ziyaret edin.

Son görünüm

Formu kullanarak bazı görevler ekledikten sonra görev listesi uygulamamızın tarayıcıda nasıl göründüğünü burada bulabilirsiniz. Şablonun şekillendirilmesinde dilediğiniz gibi daha fazla iyileştirme yapabilirsiniz.

Çözüm

Bu makalede Django'nun MVT mimarisindeki bileşenleri, bunların birbirleriyle nasıl etkileşime girdiğini ve web deneyimlerini nasıl kusursuz hale getirdiğini öğrendiniz. Ayrıca pratikte nasıl çalıştığını görmek için basit bir proje geliştirdik ve umarım şimdi daha iyi anlarsınız.

Bu makaleyi okumaktan hoşlanıyorsanız, beni daha fazla programlama makalesi ve yayınları için X'de takip edebilir veya LinkedIn'de benimle bağlantı kurabilirsiniz.

Bir sonrakinde görüşürüz!