البرمجة

تحويل ID إلى Slug في Django: جعل عناوين الروابط أكثر ودية

بمجرد النظر إلى الكود الخاص بك، يبدو أنك ترغب في تحويل معرف الكائن (ID) إلى Slug في Django لجعل عناوين URL أكثر ودية وفهماً. لتحقيق ذلك، يتعين عليك إجراء بعض التغييرات في النموذج، ومن ثم في الرؤوس والتصفيات والقوالب. سأقدم لك شرحًا مفصلاً حول كيفية تحقيق هذا الهدف.

أولاً وقبل كل شيء، يجب عليك تعديل نموذجك ليتضمن الحقل “slug” كحقل مرتبط بالعنوان:

python
from django.db import models from django.utils.text import slugify class Post(models.Model): title = models.CharField(max_length=200) description = models.TextField(max_length=10000) pub_date = models.DateTimeField(auto_now_add=True) comments = models.CharField(max_length=200, blank=True) slug = models.SlugField(max_length=40, unique=True, blank=True) def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title) super().save(*args, **kwargs) def __unicode__(self): return self.title def description_as_list(self): return self.description.split('\n')

في هذا التغيير، أضفنا حقلًا جديدًا هو “slug” ونستخدم slugify لتحويل العنوان إلى Slug تلقائيًا عندما يتم حفظ الكائن.

ثم، في admin.py، لاحظ التغييرات في تعريف الفئة PostAdmin:

python
from django.contrib import admin from .models import Post class PostAdmin(admin.ModelAdmin): list_display = ['title', 'description', 'slug'] prepopulated_fields = {'slug': ('title',)} class Meta: model = Post admin.site.register(Post, PostAdmin)

وفي urls.py، يجب عليك تحديث نمط التحقق لاستخدام الـ slug بدلاً من الـ id:

python
from django.urls import path from .views import PostListView, detail urlpatterns = [ path('', PostListView.as_view(), name='home'), path('/', detail, name='detail'), ]

وأخيراً في views.py، ضع بديلًا للوصول إلى الكائن باستخدام Slug:

python
from django.shortcuts import render, get_object_or_404 from django.views.generic import ListView from .models import Post class PostListView(ListView): model = Post template_name = 'blog_post.html' queryset = Post.objects.order_by('-pub_date') paginate_by = 2 def detail(request, slug): post = get_object_or_404(Post, slug=slug) return render(request, "blog_detail.html", {'post': post})

بتطبيق هذه التغييرات، يجب أن يتم تحويل الـ id إلى Slug بشكل تلقائي عند حفظ الكائن، وتستخدم العناوين الURL الودية في جميع أنحاء التطبيق الخاص بك.

المزيد من المعلومات

بالتأكيد، سأواصل شرح المزيد من المعلومات حول التغييرات التي قمت بها في الكود لتحويل الـ ID إلى Slug في Django.

  1. تحديث نموذج الكائن:
    في نموذج Post، قمت بإضافة حقل slug، الذي يستخدم لتخزين العنوان الودي. هذا الحقل يُنشأ تلقائيًا باستخدام دالة slugify عند حفظ الكائن. هذا يساعد على جعل العنوان جزءًا من الرابط بشكل صديق لمحركات البحث والزوار.

  2. تحديث فئة الإدارة (admin.py):
    في فئة PostAdmin، أضفت الحقل slug إلى list_display ليظهر في صفحة الإدارة. أيضا، استخدمت prepopulated_fields لجعل الحقل slug يستند إلى قيمة الحقل title تلقائيًا عند إنشاء كائن جديد.

  3. تحديث نمط الـ URL (urls.py):
    في ملف urls.py، قمت بتحديث نمط التحقق ليستخدم الـ slug بدلاً من الـ id في عنوان الرابط. هذا يضمن أن يتم استخدام الـ slug للوصول إلى التفاصيل المتعلقة بالكائن.

  4. تحديث العرض (views.py):
    في فئة PostListView ودالة detail، ضبطت الكود ليستخدم الـ slug بدلاً من الـ id. استخدمت get_object_or_404 للحصول على الكائن بناءً على قيمة الـ slug وضمنت هذا الكائن في استجابة العرض.

  5. تحديث القالب (templates):
    في القالب (مثال: blog_post.html)، قمت بتحديث الرابط لاستخدام الـ slug بدلاً من الـ id باستخدام {% url ‘detail’ slug=threads.slug %}.

بهذه التغييرات، يجب أن يكون لديك نظام Django يستخدم الـ slug بشكل صحيح لتمثيل الكائنات في عناوين URL. هذا يحسن قابلية القراءة للروابط ويسهل على محركات البحث فهم محتوى الموقع، مما يؤدي إلى تحسين تجربة المستخدم وفاعلية البحث.

زر الذهاب إلى الأعلى