
كيفية برمجة موقع إعلانات مبوبة باستخدام Python Django
في عالم التجارة الإلكترونية المتنامي، تظل مواقع الإعلانات المبوبة منصة
حيوية لربط البائعين والمشترين محليًا وعالميًا. إذا كنت تطمح لتعلم كيفية برمجة
موقع إعلانات مبوبة احترافي باستخدام Python Django، فأنت في المكان الصحيح.
هذا الدليل الشامل سيأخذك خطوة بخطوة خلال عملية إنشاء منصة قوية وسهلة
الاستخدام لعرض وإدارة الإعلانات المبوبة. سنتناول كل شيء بدءًا من تصميم واجهة
مستخدم جذابة لعرض الإعلانات وتفاصيلها، مرورًا بتعريف نماذج البيانات لتخزين
معلومات الإعلانات والفئات والمستخدمين، وصولًا إلى تمكين المستخدمين من إضافة
إعلانات جديدة و حفظ بيانات الإعلانات، وتنفيذ وظائف البحث والتصفية، وإنشاء
نظام مستخدمين آمن، وأخيرًا نشر التطبيق ليصبح متاحًا للجمهور. انطلق معنا في هذه
الرحلة لتعلم كيفية برمجة موقع إعلانات مبوبة باستخدام Python Django بطريقة منظمة وفعالة.
خطوات برمجة موقع إعلانات مبوبة باستخدام Python Django
الخطوة 1: إعداد بيئة التطوير وإنشاء مشروع Django
تأكد من تثبيت Python و pip على جهازك. ثم قم بتثبيت Django :
pip install django
--
* أنشئ مشروع Django جديدًا باسم classifieds_platform :
django-admin startproject classifieds_platform
cd classifieds_platform
--
* أنشئ تطبيقًا داخل المشروع باسم ads :
python manage.py startapp ads
--
الخطوة 2: تعريف نماذج البيانات (Models)
في ملف ads/models.py، سنقوم بتعريف نماذج البيانات الأساسية
للإعلانات والفئات والصور والمستخدمين :
Python
from django.db import modelsfrom django.contrib.auth.models import Userfrom django.utils.text import slugify
class Category(models.Model): name = models.CharField(max_length=100, unique=True) slug = models.SlugField(max_length=100, unique=True, blank=True)
class Meta: verbose_name_plural = 'Categories'
def __str__(self): return self.name
def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.name) super().save(*args, **kwargs)
class Ad(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) category = models.ForeignKey(Category, on_delete=models.CASCADE) title = models.CharField(max_length=255) slug = models.SlugField(max_length=255, unique=True, blank=True) description = models.TextField() price = models.DecimalField(max_digits=10, decimal_places=2) location = models.CharField(max_length=255) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) is_active = models.BooleanField(default=True)
def __str__(self): return self.title
def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title) super().save(*args, **kwargs)
class AdImage(models.Model): ad = models.ForeignKey(Ad, on_delete=models.CASCADE, related_name='images') image = models.ImageField(upload_to='ads/') uploaded_at = models.DateTimeField(auto_now_add=True)
def __str__(self): return f"Image for {self.ad.title}"
--
* أضف تطبيق ads إلى قائمة INSTALLED_APPS في ملف
classifieds_platform/settings.py :
Python
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ads', # إضافة تطبيق ads هنا
]
--
* قم بإنشاء التغييرات وتنفيذها :
python manage.py makemigrations ads
python manage.py migrate
--
الخطوة 3: إنشاء واجهة المستخدم (Templates)
أنشئ مجلدًا باسم templates داخل مجلد تطبيق ads. ثم أنشئ ملفات HTML التالية:
* ads/templates/ads/ad_list.html: لعرض قائمة الإعلانات:
HTML
<!DOCTYPE html>
<html>
<head>
<title>الإعلانات المبوبة</title>
</head>
<body>
<h1>الإعلانات المعروضة</h1>
<ul>
{% for ad in ads %}
<li><a href="{% url 'ad_detail' ad.slug %}">{{ ad.title }}</a> - {{ ad.price }} - {{ ad.location }}</li>
{% empty %}
<li>لا توجد إعلانات معروضة حاليًا.</li>
{% endfor %}
</ul>
<a href="{% url 'add_ad' %}">أضف إعلانًا جديدًا</a>
</body>
</html>
--
* ads/templates/ads/ad_detail.html: لعرض تفاصيل الإعلان:
HTML
<!DOCTYPE html><html><head> <title>{{ ad.title }}</title></head><body> <h1>{{ ad.title }}</h1> <p>السعر: {{ ad.price }}</p> <p>الموقع: {{ ad.location }}</p> <p>الوصف: {{ ad.description }}</p> <p>تاريخ الإضافة: {{ ad.created_at }}</p> {% if ad.images.all %} <div> {% for image in ad.images.all %} <img src="{{ image.image.url }}" alt="صورة للإعلان" style="max-width: 300px;"> {% endfor %} </div> {% endif %} <a href="{% url 'ad_list' %}">العودة إلى قائمة الإعلانات</a></body></html>
--
* ads/templates/ads/add_ad.html: لنموذج إضافة إعلان جديد:
HTML
<!DOCTYPE html>
<html>
<head>
<title>إضافة إعلان جديد</title>
</head>
<body>
<h1>أضف إعلانًا جديدًا</h1>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">إضافة الإعلان</button>
</form>
<a href="{% url 'ad_list' %}">العودة إلى قائمة الإعلانات</a>
</body>
</html>
--
الخطوة 4: إنشاء النماذج (Forms)
في ملف ads/forms.py (إذا لم يكن موجودًا، قم بإنشائه):
Python
from django import forms
from .models import Ad, AdImage
class AddAdForm(forms.ModelForm):
class Meta:
model = Ad
fields = ['category', 'title', 'description', 'price', 'location']
class AddImageForm(forms.ModelForm):
class Meta:
model = AdImage
fields = ['image']
widgets = {
'image': forms.ClearableFileInput(attrs={'multiple': True}),
}
--
الخطوة 5: إنشاء طرق العرض (Views)
* في ملف ads/views.py :
Python
from django.shortcuts import render, redirect, get_object_or_404from .models import Ad, Category, AdImagefrom .forms import AddAdForm, AddImageFormfrom django.contrib.auth.decorators import login_requiredfrom django.db import transaction
def ad_list(request): ads = Ad.objects.filter(is_active=True).order_by('-created_at') return render(request, 'ads/ad_list.html', {'ads': ads})
def ad_detail(request, slug): ad = get_object_or_404(Ad, slug=slug, is_active=True) return render(request, 'ads/ad_detail.html', {'ad': ad})
@login_requireddef add_ad(request): if request.method == 'POST': ad_form = AddAdForm(request.POST) image_form = AddImageForm(request.POST, request.FILES) if ad_form.is_valid() and image_form.is_valid(): ad = ad_form.save(commit=False) ad.user = request.user ad.save() for image in request.FILES.getlist('image'): AdImage.objects.create(ad=ad, image=image) return redirect('ad_detail', slug=ad.slug) else: ad_form = AddAdForm() image_form = AddImageForm() return render(request, 'ads/add_ad.html', {'ad_form': ad_form, 'image_form': image_form})
--
الخطوة 6: تعريف مسارات URL (URLs)
في ملف ads/urls.py (إذا لم يكن موجودًا، قم بإنشائه):
Python
from django.urls import path
from . import views
urlpatterns = [
path('', views.ad_list, name='ad_list'),
path('add/', views.add_ad, name='add_ad'),
path('<slug:slug>/', views.ad_detail, name='ad_detail'),
]
--
* قم بتضمين مسارات تطبيق ads في ملف classifieds_platform/urls.py :
Python
from django.contrib import adminfrom django.urls import path, includefrom django.conf import settingsfrom django.conf.urls.static import staticurlpatterns = [ path('admin/', admin.site.urls), path('classifieds/', include('ads.urls')), path('accounts/', include('django.contrib.auth.urls')), # لتسجيل الدخول والخروج path('', lambda request: redirect('/classifieds/')), # إعادة التوجيه إلى قائمة الإعلانات عند الوصول إلى الجذر] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
--
تأكد من إضافة 'django.contrib.auth' إلى INSTALLED_APPS في settings.py.
الخطوة 7: إنشاء واجهة إدارة (Django Admin)
لتسهيل إدارة الإعلانات والفئات والصور، قم بتسجيل النماذج في
Django Admin في ملف ads/admin.py:
Python
from django.contrib import adminfrom .models import Ad, Category, AdImage
class AdImageInline(admin.TabularInline): model = AdImage extra = 3
@admin.register(Category)class CategoryAdmin(admin.ModelAdmin): list_display = ('name', 'slug') prepopulated_fields = {'slug': ('name',)}
@admin.register(Ad)class AdAdmin(admin.ModelAdmin): list_display = ('title', 'category', 'user', 'price', 'location', 'created_at', 'is_active') list_filter = ('category', 'is_active') search_fields = ('title', 'description', 'location') prepopulated_fields = {'slug': ('title',)} inlines = [AdImageInline]
@admin.register(AdImage)class AdImageAdmin(admin.ModelAdmin): list_display = ('ad', 'image', 'uploaded_at')
--
*قم بإنشاء مستخدم مسؤول إذا لم يكن لديك واحدًا بالفعل:python manage.py createsuperuser--
* ثم قم بتشغيل خادم التطوير وقم بزيارة
http://127.0.0.1:8000/admin/ لتسجيل الدخول وإدارة الإعلانات والفئات.
الخطوة 8: حفظ بيانات الإعلانات
يتم حفظ بيانات الإعلانات في قاعدة البيانات عند تقديم نموذج إضافة الإعلان
(AddAdForm) في طريقة العرض add_ad. يتم إنشاء كائن Ad جديد
مرتبط بالمستخدم والفئة، ويتم حفظ الصور المرتبطة بالإعلان باستخدام
نموذج AdImage. Django ORM يتولى عملية التفاعل مع قاعدة البيانات
وحفظ البيانات بناءً على تعريف النماذج والعلاقات بينها.
الخطوة 9: نشر التطبيق
لنشر تطبيق Django، يمكنك اتباع الخطوات العامة التالية (باستخدام Gunicorn و Nginx كمثال):
* تثبيت Gunicorn :
pip install gunicorn
--
* اختبار Gunicorn : انتقل إلى مجلد مشروع Django وقم بتشغيل:
gunicorn classifieds_platform.wsgi:application
* تثبيت Nginx :
sudo apt update
sudo apt install nginx
--
* تكوين Nginx : قم بإنشاء ملف تكوين جديد للموقع الخاص بك في
/etc/nginx/sites-available/ (مثل classifieds_platform)
وقم بربطه بـ /etc/nginx/sites-enabled/. مثال على التكوين:
Nginx
server { listen 80; server_name your_domain_or_IP;
location /static/ { alias /path/to/your/project/staticfiles/; }
location /media/ { alias /path/to/your/project/media/; }
location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}
--
* استبدل your_domain_or_IP بعنوان نطاقك أو عنوان
IP الخاص بالخادم، و /path/to/your/project/staticfiles/ بالمسا
ر الفعلي لمجلد الملفات الثابتة الخاص بك، و
/path/to/your/project/media/ بالمسار الفعلي لمجلد الوسائط الخاص بك.
* جمع الملفات الثابتة :
python manage.py collectstatic
--
تكوين نظام إدارة العمليات (مثل systemd) لتشغيل Gunicorn تلقائيًا.
* إعادة تشغيل Nginx :
sudo systemctl restart nginx
--
تأمين الخادم الخاص بك (مثل إعداد جدار حماية وتكوين HTTPS باستخدام Let's Encrypt).
* الخلاصة :
لقد استعرضنا الخطوات الأساسية لبرمجة موقع إعلانات مبوبة احترافي
باستخدام Python Django، بدءًا من إنشاء واجهة المستخدم لعرض
الإعلانات وتفاصيلها ونموذج الإضافة، مرورًا بتعريف نماذج البيانات للإعلانات والفئات
والصور، وصولًا إلى تمكين المستخدمين من إضافة الإعلانات و حفظ بياناتها وعرضها،
وتقديم نظرة عامة على عملية نشر التطبيق. يمكنك الآن تطوير هذا الموقع بإضافة
المزيد من الميزات مثل البحث المتقدم، وتصفية الإعلانات حسب الفئة والموقع والسعر،
ونظام مراسلة بين المستخدمين، وإشعارات البريد الإلكتروني، والمزيد من التحسينات
على واجهة المستخدم وتجربة المستخدم. تذكر دائمًا التركيز على أمان
التطبيق وحماية بيانات المستخدمين والصور المرفوعة.