يمتلك Django إطار عمل مدمج sitemap يسمح للمطورين بإنشاء خرائط الموقع ديناميكيًا.
ملف Sitemap هو ملف XML يُعلم محركات البحث بصفحات موقع الويب الخاص بك ، وأهميتها ، وعدد مرات تحديثها.
و سيصبح موقع الويب الخاص بك مرئيًا بشكل أكبر على محركات البحث إذا كنت تستخدم ملف Sitemap لأنه يساعد برامج الزحف الخاصة بهم على فهرسة موقع الويب الخاص بك بالكامل.
يوجد ملف Sitemap عادةً في مكان واحد ، مثل /sitemap.xml
. فعلى سبيل المثال توجد خريطة الموقع الخاصة بهذا الموقع على https://pyarabic.com/sitemap.xml.
قبل أن نتمكن من إنشاء خريطة موقع نحتاج إلى موقع ويب Django! لنقم بإنشاء تطبيق recipes
لهذا الغرض.
الإعداد الأولي
في سطر الأوامر انتقل إلى دليل سطح المكتب وأنشئ دليلًا جديدًا يسمى recipes
ثم انتقل إليه.
# Windows
$ cd onedrive\desktop\code
$ mkdir recipes
$ cd recipes
# macOS
$ cd ~/desktop/code
$ mkdir recipes
$ cd recipes
الآن قم بإعداد وتنشيط بيئة افتراضية ، ثبّت Django ، وأنشئ مشروعًا جديدًا يسمى django_project
.
# Windows
$ python -m venv .venv
$ .venv\Scripts\Activate.ps1
(.venv) $ python -m pip install django
(.venv) $ django-admin startproject django_project .
# macOS
$ python3 -m venv .venv
$ source .venv/bin/activate
(.venv) $ python3 -m pip install django
(.venv) $ django-admin startproject django_project .
تطبيق Recipes
سوف نقوم بتسمية تطبيقنا بإسم recipes
. قم بإنشائه باستخدام الأمر startapp
.
(.venv) $ python manage.py startapp recipes
قم بتحديث ملف django_project/settings.py
لتسجيل التطبيق حتى يتعرف عليه جانغو.
# django_project/settings.py
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"recipes", # جديد
]
بعد ذلك قم بتشغيل أمر migrate
الأول لتهيئة قاعدة البيانات.
(.venv) $ python manage.py migrate
النموذج
سيحتوي نموذجنا على title
, description
وحقل updated_at
لكل وصفة. سنضيف أيضًا طريقة str
وطريقة get_absolute_url
.
# recipes/models.py
from django.db import models
from django.urls import reverse
class Recipe(models.Model):
title = models.CharField(max_length=50)
description = models.TextField()
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("recipes_detail", args=[str(self.id)])
الآن أنشئ ملف ترحيل لهذا التغيير وأضفه إلى قاعدة البيانات الخاصة بنا عبر أمر migrate
.
(.venv) $ python manage.py makemigrations recipes
(.venv) $ python manage.py migrate
Admin
يعد Django admin طريقة ملائمة للتعامل مع بياناتنا، لذا قم بإنشاء حساب superuser
لتسجيل الدخول.
(.venv) $ python manage.py createsuperuser
وحتى لا ننسى خطوة مهمة نحتاج أيضًا إلى تحديث recipes/admin.py
لعرض تطبيقنا الجديد في صفحة المسؤول.
# recipes/admin.py
from django.contrib import admin
from .models import Recipe
class RecipeAdmin(admin.ModelAdmin):
list_display = ("title", "description",)
admin.site.register(Recipe, RecipeAdmin)
قم بتشغيل الخادم المحلي باستخدام الأمر python manage.py runserver
وقم بتسجيل الدخول على http://127.0.0.1:8000/admin باستخدام حساب المدير الخاص بك.
انقر فوق “+إضافة” بجوار قسم Recipe
وقم بإنشاء وصفتين جديدتين.
مذهل. لدينا محتوى الأن ، ولكن لا تزال هناك حاجة إلى إضافة مسارات URL و طرق العرض و القوالب الخاصة بنا.
عناوين URL
هناك ملفان لعنوان URL يجب تحديثهما: ملف المستوى الأعلى لدينا على django_project/urls.py
ثم ملف داخل تطبيق recipes
الذي يجب إنشاؤه.
في محرر النصوص الخاص بك، أنشئ ملف recipes/urls.py
وأضف الكود التالي:
# recipes/urls.py
from django.urls import path
from .views import RecipesListView, RecipesDetailView
urlpatterns = [
path("<int:pk>", RecipesDetailView.as_view(), name="recipes_detail"),
path("", RecipesListView.as_view(), name="recipes_list"),
]
ثم قم بتحديث django_project/urls.py
.
# django_project/urls.py
from django.contrib import admin
from django.urls import path, include # جديد
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("recipes.urls")), # جديد
]
العروض
سوف نستخدم العرض المدمج المستندة إلى الفئات للحصول على صفحات القائمة والتفاصيل.
# recipes/views.py
from django.views.generic import ListView, DetailView
from .models import Recipe
class RecipesListView(ListView):
model = Recipe
template_name = "recipes_list.html"
class RecipesDetailView(DetailView):
model = Recipe
template_name = "recipes_detail.html"
القوالب
أخيرًا هناك حاجة إلى قالب للصفحات التي قمنا بإنشاءها. قم بإنشاء مجلد templates
جديد داخل تطبيق recipes
وأضف ملفين HTML فارغين.
recipes/templates/recipes_list.html
recipes/templates/recipes_detail.html
تعرض صفحة recipes_list.html
جميع الوصفات.
<!-- recipes/templates/recipes_list.html -->
<h1>Recipes</h1>
{% for recipe in object_list %}
<ul>
<li><a href="{{ recipe.get_absolute_url }}">{{ recipe.title }}</a></li>
</ul>
{% endfor %}
أما صفحة recipes_detail.html
تقوم بعرض كل وصفة على حدى بالتفصيل.
<!-- recipes/templates/recipes_detail.html -->
<div>
<h2>{{ object.title }}</h2>
<p>{{ object.description }}</p>
</div>
هذا كل شيء! لدينا الآن ثلاث صفحات في تطبيقنا الأساسي:
- الصفحة الرئيسية مع جميع الوصفات.
- صفحة تفصيلية لكل من الوصفتين التي لدينا في قاعدة البيانات.
Sitemap
يعتمد إطار عمل Sitemap على إطار مواقع Django ، والذي يتيح لك استخدام مشروع Django واحد لتشغيل مواقع ويب متعددة والتفريق بينها.
أضف إطار عمل sites
وتطبيق sitemaps
إلى إعداد INSTALLED_APPS
لمشروعنا.
يجب أيضًا تعيين site_id ؛ و نظرًا لأن لدينا موقعًا واحدًا فقط في مشروعنا يمكننا استخدام 1
.
# django_project/settings.py
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"django.contrib.sites", # جديد
"django.contrib.sitemaps", # جديد
"recipes",
]
SITE_ID = 1 # جديد
يتطلب إطار العمل sites
تحديثًا لقاعدة البيانات الخاصة بنا ، لذلك قم بتشغيل migrate
.
(.venv) $ python manage.py migrate
GenericSitemap
هناك طرق عديدة لإنشاء خريطة الموقع، ولكننا سنبدأ بأبسطها، وهي استخدام GenericSitemap، وهي فئة ملائمة للاختصارات للاستخدام الشائع لخريطة الموقع. كما يسمح لنا بإنشاء خريطة موقع بالكامل داخل ملف urls.py
.
نظرًا لأن لدينا تطبيقًا واحدًا فقط، فسنضيفه إلى ملف django_project/urls.py
على مستوى المشروع، ولكن يمكنك أيضًا إضافته إلى أحد التطبيقات إذا رغبت في ذلك.
# django_project/urls.py
from django.contrib import admin
from django.contrib.sitemaps import GenericSitemap # جديد
from django.contrib.sitemaps.views import sitemap # جديد
from django.urls import path, include
from recipes.models import Recipe # جديد
# قاموس جديد...
info_dict = {
"queryset": Recipe.objects.all(),
"date_field": "updated_at",
}
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("recipes.urls")),
# new path below...
path(
"sitemap.xml",
sitemap,
{"sitemaps": {"recipes": GenericSitemap(info_dict)}},
),
]
في الجزء العلوي من الملف، قمنا باستيراد GenericSitemap
و sitemap
. كما يجب علينا أيضًا استيراد نموذج Recipe
من تطبيق recipes
.
ثم قمنا بإنشاء قاموس – اسمه info_dict
– يحتوي على إدخال مجموعة استعلام. في هذه الحالة، سنحصل على جميع الكائنات، ولكن يمكن استخدام المرشحات وفقًا لحالة الاستخدام الخاصة بك.
كما قمنا بإضافة المفتاح الاختياري date_field
، المستخدم لسمة lastmod
في خريطة الموقع التي قمنا بإنشاؤها. وهذا يعني اننا قمنا بتعيينه على حقل updated_at
من نموذج ا Recipe
.
ثم قمنا بإنشاء مسار عنوان URL جديدًا يُحوّل النمط إلى “sitemap.xml” ويستخدم عرض sitemap
من Django.
يتم تمرير قاموس sitemaps
باسم “recipes”. من الممكن تحديد خرائط مواقع متعددة بهذا النمط.
إذا قمت بتشغيل الخادم المحلي باستخدام python manage.py runserver
، فيمكنك الآن الانتقال إلى http://127.0.0.1:8000/sitemap.xml في متصفح الويب الخاص بك لرؤية خريطة الموقع التي تم إنشاؤها لوصفتينا.
Sitemap.py
هناك خيار أكثر دقة لإنشاء خرائط الموقع وهو إنشاء ملف sitemap.py
مخصص، والذي يمكن أن يوجد داخل التطبيق أو الدليل على مستوى المشروع.
يوفر هذا الخيار التحكم الكامل والوصول إلى القائمة الطويلة من الطرق المتاحة لخريطة الموقع.
في هذا الدرس سنقوم بإنشاء ملف django_project/sitemaps.p
على مستوى المشروع.
في الجزء العلوي من الملف، قم باستيراد فئة Sitemap
ونموذج Recipe
الخاص بنا. ثم قم بإنشاء فئة جديدة تسمى RecipesSitemap
و فئة فرعية Sitemap
.
الطريقة الوحيدة المطلوبة هي items، والتي تُرجع مجموعة استعلام من الكائنات.
سوف نقوم بتعيين lastmod
على قيمة حقل updated_at
الخاص بنموذجنا لتوضيح كيفية إضافة سمات إضافية.
# django_project/sitemaps.py
from django.contrib.sitemaps import Sitemap
from recipes.models import Recipe
class RecipesSitemap(Sitemap):
def items(self):
return Recipe.objects.all()
def lastmod(self, obj):
return obj.updated_at
الآن نقوم بتحديث ملف django_project/urls.py
لتعيين مسار URL لخريطة الموقع. كمت لم نعد بحاجة إلى استيراد GenericSitemap
، أو إنشاء قاموس مثل info_dict
، أو استيراد نموذج Recipe
كما فعلنا من قبل.
بدلاً من ذلك، سقوم باستيراد RecipesSitemap
و تعيين مسار URL إلى “sitemap.xml”. و سيتم بعد ذلك تمرير قاموس sitemaps
إلى عرض sitemap
.
# django_project/urls.py
from django.contrib import admin
from django.contrib.sitemaps.views import sitemap # جديد
from django.urls import path, include
from .sitemaps import RecipesSitemap # جديد
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("recipes.urls")),
# جديد sitemap رابط...
path(
"sitemap.xml",
sitemap,
{"sitemaps": {"recipes": RecipesSitemap}},
),
]
إذا قمت بتحديث متصفح الويب الخاص بك، فستكون النتائج هي نفسها كما كانت من قبل!
لمزيد من المعلومات حول خرائط الموقع، راجع https://www.sitemaps.org/protocol.html. أما إذا كانت لديك صفحات ثابتة على موقعك – على سبيل المثال، صفحة “حول” – فمن الممكن إنشاء خريطة موقع للصفحات الثابتة فقط.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.