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ıncharfield
,boereanfield
gibi tuttuğu veri türünü ifade eder.Optional_field_characteristics
: Alanınmax_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 birCharField
.
Açıklama
: daha uzun metin içintextField . tamamlandı
:true veya false
değerini,false /code> 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ı
vetamamlandı
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ı olanTaskForm
adında yeni bir sınıf oluşturur.sınıf meta:
: Django’nunModelform
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 formGö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 birgö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!