البدء مع Django: بناء أول تطبيق ويب
دليل تفاعلي خطوة بخطوة للمبتدئين تمامًا
1. مقدمة إلى Django
ما هو Django؟
Django هو إطار عمل ويب عالي المستوى بلغة Python يشجع على التطوير السريع والتصميم النظيف العملي. إنه يهتم بالكثير من متاعب تطوير الويب، مما يتيح لك التركيز على كتابة التطبيق دون الحاجة لإعادة اختراع العجلة.
يتبع Django فلسفة "شامل المكونات" ويوفر تقريبًا كل ما قد يحتاجه المطورون "جاهزًا للاستخدام". وبما أن كل ما تحتاجه هو جزء من المنتج الواحد، فإنه يعمل بسلاسة، ويتبع مبادئ تصميم متسقة، ويوفر وثائق شاملة ومحدّثة.
لماذا Django؟
- سريع للغاية - صُمم Django لمساعدة المطورين على تحويل الأفكار إلى تطبيقات بسرعة.
- آمن للغاية - يأخذ Django الأمان على محمل الجد ويساعد المطورين على تجنب العديد من الأخطاء الأمنية الشائعة.
- قابل للتوسع بشكل استثنائي - تستخدم بعض أكثر المواقع ازدحامًا على الويب Django للتعامل مع أعلى متطلبات حركة المرور.
- مرن جدًا - استخدمت شركات ومنظمات وحكومات Django لبناء جميع أنواع الأنظمة، بدءًا من أنظمة إدارة المحتوى إلى الشبكات الاجتماعية ومنصات الحوسبة العلمية.
هيكلية Django
يتبع Django نمط العمارة Model-View-Template (MVT)، وهو نسخة معدلة من نمط Model-View-Controller (MVC):
هيكل البيانات وقاعدة البيانات
منطق العمل ومعالجة البيانات
منطق العرض وإظهار المحتوى
التوجيه والتعيين
اختبار سريع: أساسيات Django
اختبر فهمك لأساسيات Django:
ما هو النمط المعماري الذي يتبعه Django؟
2. إعداد بيئة العمل
قبل بدء بناء تطبيق Django، نحتاج إلى إعداد بيئة التطوير. يشمل ذلك تثبيت Python، إنشاء بيئة افتراضية، وتثبيت Django.
تثبيت Python
Django هو إطار عمل Python، لذا نحتاج أولاً إلى تثبيت Python. يتطلب Django 4.0+ Python 3.8 أو أعلى.
- قم بتنزيل Python من python.org/downloads
- أثناء التثبيت، تأكد من تحديد "Add Python to PATH"
تحقق من التثبيت بفتح الطرفية أو موجه الأوامر وكتابة:
python --version
يجب أن ترى شيئًا مثل Python 3.10.0
(قد يختلف الإصدار لديك).
إنشاء بيئة افتراضية
تتيح لك البيئات الافتراضية وجود بيئات Python معزولة لمشاريع مختلفة حتى لا تتداخل تبعياتها مع بعضها البعض.
افتح الطرفية وانتقل إلى المجلد الذي ترغب في إنشاء مشروعك فيه:
cd path/to/your/projects/folder
قم بإنشاء مجلد جديد لمشروعك:
mkdir mynotes
cd mynotes
قم بإنشاء بيئة افتراضية:
python -m venv venv
python3 -m venv venv
قم بتفعيل البيئة الافتراضية:
venv\Scripts\activate
source venv/bin/activate
ستعرف أن البيئة الافتراضية مفَعلة عندما ترى (venv)
في بداية موجه الأوامر.
تثبيت Django
مع تفعيل البيئة الافتراضية، قم بتثبيت Django:
pip install django
تحقق من التثبيت:
python -m django --version
يجب أن ترى رقم إصدار Django، مثل 4.2.1
(قد يختلف الإصدار لديك).
اختبار سريع: البيئات الافتراضية
لماذا يجب عليك استخدام بيئة افتراضية لمشاريع Django الخاصة بك؟
3. إنشاء مشروع وتطبيق Django
في Django، يمثل المشروع التطبيق الويب بأكمله، بينما يمثل التطبيق وحدة داخل المشروع تتولى وظيفة محددة. يمكن أن يحتوي المشروع على عدة تطبيقات.
إنشاء مشروع Django
مع تفعيل بيئتك الافتراضية، نفذ الأمر التالي:
django-admin startproject mynotes .
لاحظ النقطة .
في النهاية التي تخبر Django بإنشاء المشروع في الدليل الحالي بدلاً من إنشاء مجلد جديد.
إنشاء تطبيق Django
الآن، دعونا ننشئ تطبيقًا داخل مشروعنا:
python manage.py startapp notes
تسجيل التطبيق
افتح ملف mynotes/settings.py
وأضف تطبيقك إلى قائمة INSTALLED_APPS
:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'notes', # Add this line
]
تشغيل الترحيلات الأولية
يستخدم Django الترحيلات لمتابعة التغييرات التي تجريها على النماذج وتحديث مخطط قاعدة البيانات وفقًا لذلك. دعونا نشغل الترحيلات الأولية:
python manage.py migrate
يقوم هذا الأمر بتطبيق الترحيلات المدمجة للتطبيقات الافتراضية المذكورة في INSTALLED_APPS
.
بدء خادم التطوير
دعونا نتأكد من أن كل شيء يعمل عن طريق تشغيل خادم التطوير:
python manage.py runserver
افتح متصفح الويب وانتقل إلى http://127.0.0.1:8000/. يجب أن ترى صفحة ترحيب Django.
اضغط على CTRL+C
في الطرفية لإيقاف الخادم عند الانتهاء.
اختبار سريع: المشاريع مقابل التطبيقات
ما العلاقة بين مشاريع Django والتطبيقات؟
5. إنشاء نموذج وترحيل قاعدة البيانات
النماذج هي المصدر الوحيد والنهائي للمعلومات حول بياناتك. تحتوي على الحقول الأساسية والسلوكيات الخاصة بالبيانات التي تقوم بتخزينها. في تطبيق تدوين الملاحظات لدينا، نحتاج إلى نموذج يمثل الملاحظة.
تعريف نموذج Note
افتح ملف notes/models.py
وأضف الشيفرة التالية:
from django.db import models
from django.utils import timezone
class Note(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
تقوم هذه الشيفرة بـ:
- إنشاء نموذج
Note
يحتوي على حقول العنوان (title)، المحتوى (content)، ووقت الإنشاء (created_at) - تعيين حقل
created_at
ليأخذ القيمة الافتراضية وهي الوقت الحالي - تعريف دالة
__str__
التي تُعيد العنوان عند تحويل الكائن إلى سلسلة نصية
إنشاء وتطبيق الترحيلات
تُستخدم الترحيلات في Django لمتابعة التغييرات التي تجريها على النماذج وتحديث مخطط قاعدة البيانات وفقًا لذلك. أولاً، نقوم بإنشاء ملف ترحيل:
python manage.py makemigrations notes
ينشئ هذا الأمر ملف ترحيل في مجلد notes/migrations/
. الآن، قم بتطبيق الترحيل لتحديث قاعدة البيانات:
python manage.py migrate
تسجيل النموذج في لوحة الإدارة
يأتي Django مع واجهة إدارة مدمجة يمكننا استخدامها لإدارة بياناتنا. دعونا نسجل نموذجنا فيها.
افتح ملف notes/admin.py
وأضف الشيفرة التالية:
from django.contrib import admin
from .models import Note
admin.site.register(Note)
إنشاء حساب مدير (Superuser)
للوصول إلى واجهة الإدارة، نحتاج إلى إنشاء حساب مدير:
python manage.py createsuperuser
اتبع التعليمات لإنشاء اسم مستخدم، بريد إلكتروني، وكلمة مرور.
استكشاف واجهة الإدارة
قم بتشغيل خادم التطوير:
python manage.py runserver
زر http://127.0.0.1:8000/admin/ وسجّل الدخول باستخدام بيانات مدير الحساب التي أنشأتها.
يجب أن ترى واجهة إدارة Django مع نموذج Notes مدرج. جرب إضافة بعض الملاحظات للاختبار.
العلاقة بين النموذج وقاعدة البيانات
تعريف نموذج Note
إنشاء ملفات الترحيل
تطبيقها على قاعدة البيانات
إنشاء/تحديث الجداول
اختبار سريع: نماذج Django
بعد تغيير نموذج، ما الأمران اللذان يجب تشغيلهما لتحديث قاعدة البيانات؟
6. إنشاء العروض، القوالب، وروابط URLs
الآن بعد أن قمنا بإعداد النموذج، نحتاج إلى إنشاء العروض (views)، القوالب (templates)، وروابط URL لعرض الملاحظات للمستخدمين.
إنشاء دليل القوالب
أولاً، قم بإنشاء هيكل دليل للقوالب:
mkdir -p notes/templates/notes
يبحث Django عن القوالب في مجلد "templates" داخل كل تطبيق. نضيف مجلد "notes" إضافي داخل مجلد القوالب لتفادي التعارض مع قوالب تطبيقات أخرى.
إنشاء القالب الأساسي
قم بإنشاء قالب أساسي في notes/templates/notes/base.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 %}My Notes App{% endblock %}</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<a class="navbar-brand" href="{% url 'home' %}">My Notes</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="{% url 'home' %}">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'note_list' %}">All Notes</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'note_new' %}">New Note</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container mt-4">
{% block content %}
{% endblock %}
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
يتضمن هذا القالب الأساسي Bootstrap للتنسيق ويعرّف الكتل التي ستملأها القوالب الفرعية.
إنشاء قالب الصفحة الرئيسية
قم بإنشاء الملف notes/templates/notes/home.html
:
{% extends 'notes/base.html' %}
{% block title %}Home | My Notes App{% endblock %}
{% block content %}
<div class="jumbotron">
<h1 class="display-4">Welcome to My Notes App</h1>
<p class="lead">A simple Django application to manage your notes.</p>
<hr class="my-4">
<p>Get started by creating a new note or viewing your existing notes.</p>
<a class="btn btn-primary btn-lg" href="{% url 'note_new' %}" role="button">Create New Note</a>
<a class="btn btn-secondary btn-lg" href="{% url 'note_list' %}" role="button">View All Notes</a>
</div>
{% endblock %}
إنشاء قالب قائمة الملاحظات
قم بإنشاء الملف notes/templates/notes/note_list.html
:
{% extends 'notes/base.html' %}
{% block title %}All Notes | My Notes App{% endblock %}
{% block content %}
<h1>All Notes</h1>
{% if notes %}
<div class="row">
{% for note in notes %}
<div class="col-md-4 mb-4">
<div class="card">
<div class="card-body">
<h5 class="card-title">{{ note.title }}</h5>
<p class="card-text">{{ note.content|truncatechars:100 }}</p>
<p class="text-muted">Created: {{ note.created_at|date:"F j, Y" }}</p>
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<p>No notes yet. <a href="{% url 'note_new' %}">Create one</a>!</p>
{% endif %}
{% endblock %}
إنشاء العروض (Views)
افتح الملف notes/views.py
وأضف الشيفرة التالية:
from django.shortcuts import render
from .models import Note
def home(request):
return render(request, 'notes/home.html')
def note_list(request):
notes = Note.objects.all().order_by('-created_at')
return render(request, 'notes/note_list.html', {'notes': notes})
تُنشئ هذه الدوال عرضين: واحد للصفحة الرئيسية وآخر لقائمة الملاحظات.
إنشاء روابط URLs للتطبيق
قم بإنشاء ملف جديد notes/urls.py
:
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
path('notes/', views.note_list, name='note_list'),
]
إدراج روابط URLs للتطبيق في روابط URLs للمشروع
افتح الملف mynotes/urls.py
وعدله كما يلي:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('notes.urls')),
]
يقوم هذا الأمر بإدراج روابط URL الخاصة بالتطبيق ضمن إعدادات روابط URL للمشروع.
اختبر العروض
قم بتشغيل خادم التطوير:
python manage.py runserver
زر http://127.0.0.1:8000/ لرؤية الصفحة الرئيسية، وhttp://127.0.0.1:8000/notes/ لرؤية قائمة الملاحظات.
ملاحظة: قد لا يعمل رابط "New Note" بعد لأننا لم ننشئ العرض الخاص به بعد. سنقوم بذلك في القسم التالي.
تدفق نمط MVT في Django
يطلب المستخدم رابط URL
يعالج الطلب
يتفاعل مع قاعدة البيانات
يقوم بعرض HTML
يعيد الاستجابة للمستخدم
اختبار سريع: قوالب Django
ما هو الوسم (tag) المستخدم للوراثة من القالب الأساسي؟
7. إضافة النماذج لإنشاء ملاحظات جديدة
الآن، دعونا ننشئ نموذجاً يسمح للمستخدمين بإضافة ملاحظات جديدة إلى التطبيق.
إنشاء نموذج (Form)
قم بإنشاء ملف جديد notes/forms.py
:
from django import forms
from .models import Note
class NoteForm(forms.ModelForm):
class Meta:
model = Note
fields = ['title', 'content']
widgets = {
'title': forms.TextInput(attrs={'class': 'form-control'}),
'content': forms.Textarea(attrs={'class': 'form-control', 'rows': 5}),
}
يُنشئ هذا النموذج نموذجًا مستندًا إلى نموذج Note يحتوي على حقول العنوان والمحتوى، كما يضيف فئات Bootstrap لتنسيق النموذج.
إنشاء قالب للنموذج
قم بإنشاء الملف notes/templates/notes/note_form.html
:
{% extends 'notes/base.html' %}
{% block title %}New Note | My Notes App{% endblock %}
{% block content %}
<h1>{% if form.instance.id %}Edit Note{% else %}New Note{% endif %}</h1>
<form method="post">
{% csrf_token %}
<div class="mb-3">
<label for="{{ form.title.id_for_label }}" class="form-label">Title</label>
{{ form.title }}
{% if form.title.errors %}
<div class="text-danger">{{ form.title.errors }}</div>
{% endif %}
</div>
<div class="mb-3">
<label for="{{ form.content.id_for_label }}" class="form-label">Content</label>
{{ form.content }}
{% if form.content.errors %}
<div class="text-danger">{{ form.content.errors }}</div>
{% endif %}
</div>
<button type="submit" class="btn btn-primary">Save</button>
<a href="{% url 'note_list' %}" class="btn btn-secondary">Cancel</a>
</form>
{% endblock %}
إضافة عرض لإنشاء الملاحظات
حدث ملف notes/views.py
لإضافة عرض لإنشاء الملاحظات:
from django.shortcuts import render, redirect
from .models import Note
from .forms import NoteForm
def home(request):
return render(request, 'notes/home.html')
def note_list(request):
notes = Note.objects.all().order_by('-created_at')
return render(request, 'notes/note_list.html', {'notes': notes})
def note_new(request):
if request.method == "POST":
form = NoteForm(request.POST)
if form.is_valid():
form.save()
return redirect('note_list')
else:
form = NoteForm()
return render(request, 'notes/note_form.html', {'form': form})
يضيف هذا العرض وظيفة جديدة:
- يعرض نموذجًا فارغًا عند تحميل الصفحة لأول مرة (GET request)
- يعالج بيانات النموذج عند الإرسال (POST request)
- يقوم بإعادة التوجيه إلى صفحة قائمة الملاحظات بعد حفظ الملاحظة بنجاح
تحديث روابط URLs
حدث ملف notes/urls.py
لإضافة رابط لإنشاء الملاحظات:
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
path('notes/', views.note_list, name='note_list'),
path('notes/new/', views.note_new, name='note_new'),
]
اختبر النموذج
شغل خادم التطوير:
python manage.py runserver
زر http://127.0.0.1:8000/notes/new/ للاطلاع على النموذج الخاص بإنشاء ملاحظة جديدة.
جرب إنشاء ملاحظة جديدة وتحقق من ظهورها في قائمة الملاحظات.
{% csrf_token %}
في قالب النموذج مهم للأمان؛ فهو يضيف رمز حماية من هجمات Cross-Site Request Forgery.
اختبار سريع: نماذج Django
عند إنشاء نموذج بناءً على نموذج بيانات (Model)، من أي فئة يجب أن ترث؟
8. التنسيق باستخدام Bootstrap
لقد أدخلنا Bootstrap مسبقًا في القالب الأساسي، لكن دعونا نحسن التنسيق أكثر لجعل التطبيق يبدو أكثر أناقة.
تحديث القالب الأساسي
أضف بعض CSS المخصص إلى القالب الأساسي. حدث الملف notes/templates/notes/base.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 %}My Notes App{% endblock %}</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body {
padding-bottom: 2rem;
background-color: #f8f9fa;
}
.navbar {
margin-bottom: 2rem;
box-shadow: 0 2px 4px rgba(0,0,0,.1);
}
.card {
box-shadow: 0 2px 5px rgba(0,0,0,.1);
transition: all 0.3s ease;
}
.card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 15px rgba(0,0,0,.15);
}
.jumbotron {
background-color: #ffffff;
border-radius: 0.5rem;
padding: 2rem;
box-shadow: 0 2px 5px rgba(0,0,0,.1);
}
.footer {
margin-top: 3rem;
padding-top: 1.5rem;
padding-bottom: 1.5rem;
background-color: #343a40;
color: #ffffff;
}
</style>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<a class="navbar-brand" href="{% url 'home' %}">
<i class="fas fa-sticky-note me-2"></i>My Notes
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="{% url 'home' %}">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'note_list' %}">All Notes</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'note_new' %}">New Note</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container mt-4">
{% block content %}
{% endblock %}
</div>
<footer class="footer mt-auto">
<div class="container text-center">
<p>My Notes App - Built with Django</p>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.15.4/js/all.min.js"></script>
</body>
</html>
يحتوي هذا القالب الأساسي على Bootstrap ويعرّف الكتل التي سيتم تعبئتها من قبل القوالب الفرعية.
تحديث قالب قائمة الملاحظات
قم بتحسين الملف notes/templates/notes/note_list.html
:
{% extends 'notes/base.html' %}
{% block title %}All Notes | My Notes App{% endblock %}
{% block content %}
<div class="d-flex justify-content-between align-items-center mb-4">
<h1>All Notes</h1>
<a href="{% url 'note_new' %}" class="btn btn-primary">
<i class="fas fa-plus me-2"></i>New Note
</a>
</div>
{% if notes %}
<div class="row">
{% for note in notes %}
<div class="col-md-4 mb-4">
<div class="card h-100">
<div class="card-header bg-light d-flex justify-content-between align-items-center">
<span class="text-muted">{{ note.created_at|date:"F j, Y" }}</span>
</div>
<div class="card-body">
<h5 class="card-title">{{ note.title }}</h5>
<p class="card-text">{{ note.content|truncatechars:100 }}</p>
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<div class="alert alert-info">
<i class="fas fa-info-circle me-2"></i>No notes yet. <a href="{% url 'note_new' %}" class="alert-link">Create one</a>!
</div>
{% endif %}
{% endblock %}
تحديث قالب الصفحة الرئيسية
قم بتحسين الملف notes/templates/notes/home.html
:
{% extends 'notes/base.html' %}
{% block title %}Home | My Notes App{% endblock %}
{% block content %}
<div class="jumbotron text-center">
<h1 class="display-4 mb-4">Welcome to My Notes App</h1>
<p class="lead">A simple Django application to manage your notes</p>
<hr class="my-4">
<div class="row mt-5 justify-content-center">
<div class="col-md-4 mb-4">
<div class="card text-center h-100">
<div class="card-body">
<i class="fas fa-plus-circle fa-4x mb-3 text-success"></i>
<h3 class="card-title">Create</h3>
<p class="card-text">Create new notes with titles and content</p>
<a href="{% url 'note_new' %}" class="btn btn-success">New Note</a>
</div>
</div>
</div>
<div class="col-md-4 mb-4">
<div class="card text-center h-100">
<div class="card-body">
<i class="fas fa-list-ul fa-4x mb-3 text-primary"></i>
<h3 class="card-title">View</h3>
<p class="card-text">View all your saved notes in one place</p>
<a href="{% url 'note_list' %}" class="btn btn-primary">View Notes</a>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
تحديث قالب النموذج
قم بتحسين الملف notes/templates/notes/note_form.html
:
{% extends 'notes/base.html' %}
{% block title %}New Note | My Notes App{% endblock %}
{% block content %}
<div class="card">
<div class="card-header">
<h2>{% if form.instance.id %}Edit Note{% else %}New Note{% endif %}</h2>
</div>
<div class="card-body">
<form method="post">
{% csrf_token %}
<div class="mb-3">
<label for="{{ form.title.id_for_label }}" class="form-label">Title</label>
{{ form.title }}
{% if form.title.errors %}
<div class="text-danger">{{ form.title.errors }}</div>
{% endif %}
</div>
<div class="mb-3">
<label for="{{ form.content.id_for_label }}" class="form-label">Content</label>
{{ form.content }}
{% if form.content.errors %}
<div class="text-danger">{{ form.content.errors }}</div>
{% endif %}
</div>
<div class="d-flex mt-4">
<button type="submit" class="btn btn-primary me-2">
<i class="fas fa-save me-2"></i>Save
</button>
<a href="{% url 'note_list' %}" class="btn btn-secondary">
<i class="fas fa-times me-2"></i>Cancel
</a>
</div>
</form>
</div>
</div>
{% endblock %}
اختبر التطبيق المُنسَّق
شغل خادم التطوير:
python manage.py runserver
زر http://127.0.0.1:8000/ لرؤية التطبيق المُنسَّق.
<style>
من القالب الأساسي أو في ملف CSS منفصل.
9. تشغيل واختبار التطبيق
دعونا نتأكد من أن التطبيق يعمل بشكل صحيح ونختبر جميع الميزات التي قمنا بتنفيذها.
تشغيل خادم التطوير
قم بتشغيل خادم التطوير:
python manage.py runserver
سيبدأ الخادم على http://127.0.0.1:8000/
اختبر الصفحة الرئيسية
زر الصفحة الرئيسية وتحقق من عرضها بشكل صحيح مع روابط إنشاء وعرض الملاحظات.
تأكد من أن زري "New Note" و"View Notes" يعملان بشكل صحيح.
اختبر إنشاء ملاحظة
انقر على "New Note" وأنشئ ملاحظة بعنوان ومحتوى.
بعد الإرسال، تأكد من إعادة التوجيه إلى صفحة قائمة الملاحظات وظهور الملاحظة الجديدة في القائمة.
اختبر قائمة الملاحظات
زر صفحة قائمة الملاحظات وتحقق من عرض جميع الملاحظات بشكل صحيح.
أنشئ عدة ملاحظات وتأكد من ظهورها جميعًا في القائمة.
اختبر التنقل
تحقق من أن روابط التنقل في الرأس تعمل بشكل صحيح وتنقلك إلى الصفحات المناسبة.
اختبر التحقق من صحة النموذج
حاول إرسال نموذج الملاحظة مع ترك الحقول فارغة للتأكد من أن التحقق من الصحة يعمل بشكل صحيح.
تحقق من عرض رسائل الخطأ بشكل مناسب.
10. خيارات النشر (نظرة عامة)
بعد بناء واختبار تطبيق Django الخاص بك، قد ترغب في نشره لجعله متاحًا للآخرين. إليك نظرة عامة موجزة على خيارات النشر.
الاستعداد للنشر
قبل النشر، تحتاج إلى إجراء بعض التغييرات على إعداداتك:
# في settings.py
# اضبط DEBUG على False في بيئة الإنتاج
DEBUG = False
# عيّن ALLOWED_HOSTS إلى نطاقك (أو النطاقات الخاصة بك)
ALLOWED_HOSTS = ['yourdomain.com', 'www.yourdomain.com']
# قم بتكوين قاعدة بيانات للإنتاج (مثال: PostgreSQL)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'your_database_name',
'USER': 'your_database_user',
'PASSWORD': 'your_database_password',
'HOST': 'localhost',
'PORT': '',
}
}
# تعيين SECRET_KEY آمن
SECRET_KEY = 'your-secret-key' # استخدم المتغيرات البيئية لهذا في الواقع
# تكوين الملفات الثابتة
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
منصات النشر
PythonAnywhere
منصة مناسبة للمبتدئين مصممة خصيصًا لتطبيقات Python و Django.
- متوفر مستوى مجاني
- سهل الإعداد
- مناسب للمبتدئين
Heroku
منصة كخدمة (PaaS) تتيح للمطورين بناء وتشغيل التطبيقات وإدارتها.
- متوفر مستوى مجاني (مع بعض القيود)
- خيارات توسع جيدة
- وثائق موسعة
DigitalOcean
مزود خدمة سحابة يقدم Droplets (آلات افتراضية) ومنصة التطبيقات.
- تحكم أكبر في الخادم الخاص بك
- يتطلب معرفة تقنية أكثر
- أسعار معقولة
AWS, Google Cloud, Azure
منصات سحابية كبرى تقدم خدمات متنوعة لنشر التطبيقات الوب.
- مجموعة واسعة من الميزات
- قابلية توسع عالية
- منحنى تعلم أكثر انحدارًا
خيارات متعددة متاحة
خطوات النشر العامة
- قم بإعداد قاعدة بيانات للإنتاج (مثال: PostgreSQL)
- قم بتكوين إعداداتك للإنتاج
- اجمع الملفات الثابتة:
python manage.py collectstatic
- اختر وقم بإعداد خادم ويب (مثال: Gunicorn، uWSGI)
- قم بتكوين بروكسي عكسي (مثال: Nginx، Apache)
- قم بإعداد HTTPS باستخدام شهادة (مثال: Let's Encrypt)
- انشر الكود الخاص بك على الخادم
- ابدأ تشغيل التطبيق
11. ملخص المشروع النهائي وقائمة المراجعة
ما قمنا ببنائه
تهانينا! لقد قمت ببناء تطبيق ويب بسيط باستخدام Django يسمح للمستخدمين بـ:
- عرض صفحة رئيسية منسقة مع روابط لإنشاء وعرض الملاحظات
- إنشاء ملاحظات جديدة بعنوان ومحتوى
- عرض قائمة بجميع الملاحظات
على طول الطريق، تعلمت:
- كيفية إعداد بيئة تطوير Django
- كيفية إنشاء مشروع وتطبيق Django
- كيفية تعريف النماذج والعمل مع قواعد البيانات
- كيفية إنشاء العروض والقوالب وروابط URLs
- كيفية التعامل مع النماذج ومدخلات المستخدم
- كيفية تنسيق التطبيق باستخدام Bootstrap
- كيفية اختبار التطبيق
- نظرة عامة على خيارات النشر
قائمة مراجعة المشروع
استخدم هذه القائمة للتأكد من إكمال جميع الخطوات اللازمة:
الخطوات التالية
لقد بنيت تطبيق Django أساسي، ولكن هناك العديد من الطرق لتطويره:
إضافة مصادقة المستخدم
السماح للمستخدمين بالتسجيل وتسجيل الدخول والحصول على ملاحظاتهم الخاصة.
إضافة عمليات CRUD
تنفيذ وظائف لتحديث وحذف الملاحظات.
إضافة التصنيفات/الوسوم
السماح للمستخدمين بتصنيف الملاحظات وتصفية حسب التصنيف.
إضافة تحرير نص منسق
تنفيذ محرر نص منسق لمحتوى الملاحظة.
إضافة وظيفة البحث
السماح للمستخدمين بالبحث في ملاحظاتهم.
إضافة API
إنشاء واجهة برمجة تطبيقات REST لتطبيق الملاحظات باستخدام Django REST framework.
مصادر للتعلم المزيد
- التوثيق الرسمي لـ Django - مرجع شامل ودروس تعليمية
- صفحة تحميل Django - للحصول على أحدث إصدار من Django
- توثيق Python - مرجع لغة Python
- دروس GeeksforGeeks عن Django - دروس وأمثلة إضافية
- توثيق Bootstrap - تعرف على المزيد عن التنسيق باستخدام Bootstrap
تهانينا!
لقد أكملت درس Django وبنيت أول تطبيق ويب خاص بك!
واصل استكشاف Django وبناء تطبيقات أكثر تعقيدًا لتعزيز مهاراتك.