خرائط الموقع sitemap بإستخدام جانغو

يمتلك 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 

النموذج

سيحتوي نموذجنا على  titledescription وحقل  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 باستخدام حساب المدير الخاص بك.

صفحة django 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 في متصفح الويب الخاص بك لرؤية خريطة الموقع التي تم إنشاؤها لوصفتينا.

django sitemap

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. أما إذا كانت لديك صفحات ثابتة على موقعك – على سبيل المثال، صفحة “حول” – فمن الممكن إنشاء خريطة موقع للصفحات الثابتة فقط.


اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading