Jak działa architektura MVT Django: głębokie zanurzenie się w modelach, widokach i szablonach
Django to ramy Pythona na wysokim poziomie. Jest popularny ze swojej prostoty i wydajności w budowaniu solidnych aplikacji internetowych.
Sercem architektury Django jest wzorzec Model-View-Template (MVT). Dobre zrozumienie interakcji modeli, widoków i szablonów jest kluczowe, jeśli chcesz wykorzystać pełną moc Django.
Niezależnie od tego, czy jesteś nowym użytkownikiem Django, czy początkującym, ten artykuł będzie służyć jako kompleksowy przewodnik pokazujący, jak te komponenty działają i współdziałają ze sobą, tworząc dynamiczne aplikacje internetowe.
Aby było jeszcze bardziej zrozumiałe, zbudujemy prostą aplikację, która pomoże Ci lepiej zrozumieć wzajemne połączenie tych komponentów.
Jeśli już jesteś podekscytowany, wpadnijmy na to!
Oto, co omówimy:
Warunki wstępne
Jaka jest architektura MVT?
Komponent modelu
Komponent Widok
Komponent szablonu
Schemat pokazujący przepływ pracy MVT
Rzeczywista analogia MVT
Łączenie tego wszystkiego w projekt
Wniosek
Wymagania wstępne
Aby podążać dalej, potrzebujesz:
Podstawowe zrozumienie działania aplikacji internetowych, w tym architektury klient-serwer.
Podstawowa znajomość Pythona.
Jaka jest architektura MVT?
Wzorzec MVT jest podejściem Django do organizowania bazy kodowej i przepływu pracy aplikacji internetowej. Komponenty tworzące tę architekturę są modelem, widokiem i szablonem. Każdy komponent wykonuje określone funkcje, a następnie przekazuje proces do innych komponentów, aby zrobić swoje.
Rzućmy okiem na komponenty z określonymi funkcjami, które wykonują:
Model: nazywana również warstwą danych. Zarządza danymi i wchodzi w interakcję z bazą danych.
Widok: nazywana również warstwą logiczną. Działa jako pośrednik, obsługuje logikę i zarządza przepływem danych.
Szablon: znany również jako warstwa prezentacji, renderuje treść HTML w interfejsie użytkownika.
Teraz, gdy masz już pojęcie o komponentach i ich rolach w aplikacji Django, przyjrzymy się szczegółowo każdemu komponentowi i ich interakcji w architekturze.
Komponent modelu
Modele zarządzają strukturą i interakcją danych w aplikacji Django, co czyni je podstawą aplikacji Django ze względu na kluczowe odgrywanie danych.
Modele Django wykorzystują potężną funkcję o nazwie Mapowanie obiektowe (ORM), która łączy lukę między relacyjną bazą danych a kodem Pythona. Przekształca obiekty Pythona (klasy) w tabele bazy danych, ich atrybuty w kolumny i instancje w wiersze w tych tabelach.
Ogromną zaletą ORM jest to, że umożliwia interakcję z bazą danych przy użyciu obiektów Pythona zamiast pisania zapytań SQL. Pomyśl o tym jak o tłumaczu, który konwertuje jeden język na inny, aby publiczność mogła go zrozumieć. W tym przypadku ORM tłumaczy kod Pythona na polecenia SQL, które może wykonać baza danych i odwrotnie.
Modele Django hermetyzują całą logikę związaną z bazą danych i definiują strukturę bazy danych, działając jako plan danych, które chcesz przechowywać.
Ogólny format modelu Django
W Django każdy model podąża szczególnym sposobem deklaracji. Oto podstawowa struktura deklaracji modelowej:
class <model_name>(models.Model):
<field_name> = models.<field_type>(<optional_field_characteristics>)
Rozbijmy to:
class
: słowo kluczowe używane do definiowania modelu w Django.nazwa_modelu
: nazwa modelu.models.Model
: klasa bazowa, z której dziedziczy klasa modelu.nazwa_pola
: nazwa kolumny bazy danych.field_type
: odnosi się do typu danych przechowywanych w polu, np.charField
,BooleanField
i tak dalej.opcjonalne_charakterystyki_pola
: używane do dalszego definiowania zachowania pola, np.max_length
,default
i tak dalej.
Przykład modelu
Po tym, jak do tej pory wiemy o modelach, skonstruujemy jedną z listy zadań. Zazwyczaj zawiera tytuł zadania, opis i wskaźnik, czy zadania zostały wykonane, czy nie.
class Task(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
completed = models.BooleanField(default=False)
W tym modelu:
Zadanie to nazwa modelu.
Model zadań ma trzy pola:
title
:CharField
przechowujący tekst o maksymalnej długości 100 znaków.
description
:TextField
dla dłuższego tekstu.completed
:BooleanField
, które przechowuje wartośćTrue
lubFalse
, z wartością domyślnąFalse
.
Komponent widoku
Widoki Django odpowiadają za przetwarzanie żądań użytkowników i zwracanie odpowiedzi. Działają jako pomost pomiędzy Modelem a Szablonem, zbierając dane z obiektów Modelu, wykonując na nich operacje logiczne (takie jak zapytania w oparciu o określone kryteria), a następnie przekazując dane do szablonu w celu wyświetlenia.
Widoki można zapisać jako funkcje lub klasowe, w zależności od złożoności i wymagań aplikacji.
Ogólny format widoku django
Oto podstawowa struktura widoku:
def <view_name>(request):
# View Logic goes in here....
return render(request, <template>, <context>)
Zniszmy to:
Widok_name
: Nazwa funkcji widoku.Żądanie
: Żądanie HTTP wysłane przez klienta na serwer Django może zostać uruchomione z przesyłania formularza lub kliknięciu przycisku.return render
: używany do generowania odpowiedzi HTML. To trwa:request
: obiekt żądania, który zawiera informacje o przychodzącym żądaniu.
template
: plik szablonu do renderowania.Kontekst
: Zawiera zmienne, które należy udostępnić w szablonie, zwykle występuje w postaci słownika.
Wyświetl przykład
Kontynuując naszą listę zadań, nasz pogląd będzie wyglądał następująco:
def task_list(request):
# Logic goes in here...
return render(request, <template>, {'tasks': tasks})
Komponent szablonu
Szablony Django są odpowiedzialne za renderowanie ostatecznego wyjścia HTML w przeglądarce. Określają, w jaki sposób należy przedstawić dane, stosując kombinację języka szablonów HTML i Django.
Język szablonów Django obejmuje użycie tagów szablonów {% %
i zmiennych szablonów {{ }}
, które umożliwiają wejdź w tryb Django w swoim szablonie HTML. W tym trybie możesz uzyskać dostęp do zmiennych zdefiniowanych w widokach i używać struktur kontrolnych w swoim szablonie.
Szablony można również zaprojektować za pomocą CSS lub dowolnej z twoich ulubionych frameworków CSS, aby interfejs użytkownika był bardziej prezentowany.
Przykład szablonu
Nasz szablon jest normalnym plikiem HTML z językiem szablonów Django. Oto jak wyglądałby nasz szablon listy zadań:
<!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>
W tym szablonie:
dla
pętli itera się za pośrednictwem każdego zadania na liście zadań (pamiętaj, że został przekazany jako kontekst w naszych poglądach).Dla każdego zadania wyświetla
tytuł
zadania i jego statusukończone
(jako „Ukończone” lub „Nieukończone”).Jeśli lista
zadania
jest pusta, w bloku{% pusty %
zostanie wyświetlony komunikat zastępczy o treści „Brak dostępnych zadań”.
Schemat pokazujący przepływ pracy MVT
Ten diagram przedstawia sposób przepływu danych w architekturze MVT Django:
Rzeczywista analogia MVT
Wyobraź sobie, że idziesz do restauracji i składasz zamówienie na swój ulubiony posiłek. Za kulisami restauracji znajduje się książka kucharska, w której opisano, jak należy przygotować każde danie. Szef kuchni korzysta z przepisów, aby przygotować posiłek dokładnie tak, jak go zamówiłeś. Gdy wszystko będzie gotowe, serwer dostarczy Ci posiłek w atrakcyjny sposób.
Tak jak szef kuchni postępuje zgodnie z przepisem, aby przygotować danie, widok wykorzystuje model do gromadzenia i przetwarzania danych. Wreszcie, podobnie jak serwer dostarczający danie, szablon gwarantuje, że ostateczny wynik zostanie zaprezentowany użytkownikowi w przejrzysty i wciągający sposób.
Łączenie tego wszystkiego w projekt
Ta sekcja przejdzie cię, od początku do końca, jak skonfigurować listę zadań, którego użyliśmy jako przykład w artykule. Na koniec powinieneś mieć funkcjonalną aplikację z architekturą MVT w pełnym przepływie.
Zainstaluj Python
Najpierw upewnij się, że masz zainstalowany język Python. Możesz odwiedzić oficjalną stronę Pythona, aby pobrać najnowszą wersję Pythona.
Skonfiguruj projekt i aplikację Django
Następnie zainstaluj Django. Możesz go zainstalować za pomocą PIP:
pip install django
Utwórz folder i otwórz go w swoim ulubionym edytorze kodu.
Utwórz nowy projekt i aplikację Django, uruchamiając następujące polecenia w terminalu, jeden po drugim:
django-admin startproject myproject
cd myproject
django-admin startapp myapp
Zdefiniuj model
W twoim
from django.db import models
class Task(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
completed = models.BooleanField(default=False)
Utwórz formularz
Potrzebujemy formularza Django opartego na modelu Task, więc utworzymy go za pomocą Django ModelForm.
W swojej myapp
utwórz plik, nazwij go forms.py
i wstaw ten kod:
from django import forms
from .models import Task
class TaskForm(forms.ModelForm):
class Meta:
model = Task
fields = ['title', 'description', 'completed']
W tym kodzie:
zadanie
jest importowane z.Models
.class TaskForm(forms.ModelForm)
: Tworzy nową klasę o nazwieTaskForm
, która jest podklasąforms.ModelForm
.class Meta:
: to specjalna klasa używana przezModelForm
Django w celu zapewnienia konfiguracji formularza. KlasaMeta
informuje Django, jak utworzyć formularz, określając powiązany model i pola, które mają zostać uwzględnione w formularzu.model=Zadanie
: określa model, na którym oparty jest formularz. W tym przypadku formularz opiera się na modeluTask
.Fields=[„tytuł”, „Opis”, „Ukończony”]
: Określa, które pola z modelu zadaniapowinny być zawarte w formularzu. Pozwala to kontrolować, które pola modelu pojawiają się w formie, i można je dostosować do tylko niektórych pól, a nie na wszystkie pola w modelu.
Utwórz widok
W pliku myapp/views.py
wstaw ten kod:
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})
W tym widoku
TaskForm
jest importowany zforms
.Kod sprawdza, czy metoda żądania jest
post
, wskazując, że użytkownik przesłał formularz.Jeśli metodą jest
POST
, tworzy instancjęTaskForm
przy użyciu przesłanych danych (request.POST
).Formularz jest następnie sprawdzany za pomocą
form.is _valid() , a jeśli jest prawidłowy, formularz jest zapisywany w bazie danych. Po zapisaniu użytkownik zostaje przekierowany na stronę listy zadań, aby zapobiec zduplikowaniu zgłoszeń.
Zdefiniuj szablon
W katalogu MyApp
Utwórz folder szablony . W folderze szablonów utwórz plik i nazwij go task_list.html
. Musimy dodać element formularza, który zbiera wejścia użytkownika i wyświetla je na liście w interfejsie użytkownika.
W pliku HTML task_list
mamy:
<!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>
W dodanym kodzie formularza:
Stworzyliśmy formularz HTML z metodą
POST
do przesyłania danych. Zawiera{% csrf_token %
chroniący przed atakami CSRF.Pola formularza są renderowane za pomocą
{{form.as_p}}
, który wyświetla każde pole w znaczniku<p>
.Wreszcie podano przycisk Przesyłania „Dodaj zadanie”, umożliwiając użytkownikowi przesłanie danych formularza.
Struktura folderów
Po osiągnięciu tego punktu ważne jest, aby sprawdzić, czy konfigurujesz aplikację we właściwy sposób. Oto jak powinna wyglądać struktura folderów/plików:
└── 📁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
Skonfiguruj adres URL projektu
W pliku myproject/urls.py
umieść adres URL w pliku myapp
:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]
Dodaj aplikację do ustawień projektu
Dodaj swój MyApp
do listy Zainstalowane aplikacje w swoim
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',
]
Uruchom serwer
Zastosuj migrację i uruchom serwer, wprowadzając następujące polecenia:
python manage.py migrate
python manage.py runserver
Odwiedź http://127.0.0.1:8000/
w przeglądarce, aby przetestować aplikację.
Ostateczne spojrzenie
Tak wygląda nasza aplikacja z listą zadań w przeglądarce po dodaniu zadań za pomocą formularza. Możesz wprowadzić dalsze ulepszenia w stylizacji szablonu, według własnego uznania.
Wniosek
W tym artykule dowiedziałeś się o komponentach architektury MVT Django, o tym, jak współdziałają ze sobą i jak sprawiają, że korzystanie z Internetu jest płynne. Zbudowaliśmy także prosty projekt, aby zobaczyć, jak to działa w praktyce i mam nadzieję, że teraz rozumiesz go lepiej.
Jeśli podobało Ci się czytanie tego artykułu, możesz śledzić mnie na X lub połączyć się ze mną na LinkedIn, aby uzyskać więcej artykułów programowych i postów.
Do zobaczenia na kolejnym!