بمجرد النظر إلى الكود الخاص بك، يبدو أنك ترغب في تحويل معرف الكائن (ID) إلى Slug في Django لجعل عناوين URL أكثر ودية وفهماً. لتحقيق ذلك، يتعين عليك إجراء بعض التغييرات في النموذج، ومن ثم في الرؤوس والتصفيات والقوالب. سأقدم لك شرحًا مفصلاً حول كيفية تحقيق هذا الهدف.
أولاً وقبل كل شيء، يجب عليك تعديل نموذجك ليتضمن الحقل “slug” كحقل مرتبط بالعنوان:
pythonfrom 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:
pythonfrom 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:
pythonfrom django.urls import path
from .views import PostListView, detail
urlpatterns = [
path('', PostListView.as_view(), name='home'),
path('/' , detail, name='detail'),
]
وأخيراً في views.py، ضع بديلًا للوصول إلى الكائن باستخدام Slug:
pythonfrom 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.
-
تحديث نموذج الكائن:
في نموذج Post، قمت بإضافة حقل slug، الذي يستخدم لتخزين العنوان الودي. هذا الحقل يُنشأ تلقائيًا باستخدام دالة slugify عند حفظ الكائن. هذا يساعد على جعل العنوان جزءًا من الرابط بشكل صديق لمحركات البحث والزوار. -
تحديث فئة الإدارة (admin.py):
في فئة PostAdmin، أضفت الحقل slug إلى list_display ليظهر في صفحة الإدارة. أيضا، استخدمت prepopulated_fields لجعل الحقل slug يستند إلى قيمة الحقل title تلقائيًا عند إنشاء كائن جديد. -
تحديث نمط الـ URL (urls.py):
في ملف urls.py، قمت بتحديث نمط التحقق ليستخدم الـ slug بدلاً من الـ id في عنوان الرابط. هذا يضمن أن يتم استخدام الـ slug للوصول إلى التفاصيل المتعلقة بالكائن. -
تحديث العرض (views.py):
في فئة PostListView ودالة detail، ضبطت الكود ليستخدم الـ slug بدلاً من الـ id. استخدمت get_object_or_404 للحصول على الكائن بناءً على قيمة الـ slug وضمنت هذا الكائن في استجابة العرض. -
تحديث القالب (templates):
في القالب (مثال: blog_post.html)، قمت بتحديث الرابط لاستخدام الـ slug بدلاً من الـ id باستخدام {% url ‘detail’ slug=threads.slug %}.
بهذه التغييرات، يجب أن يكون لديك نظام Django يستخدم الـ slug بشكل صحيح لتمثيل الكائنات في عناوين URL. هذا يحسن قابلية القراءة للروابط ويسهل على محركات البحث فهم محتوى الموقع، مما يؤدي إلى تحسين تجربة المستخدم وفاعلية البحث.