Menu
CoddyTech

الانتقال إلى الوظيفة الجديدة

جزء من قسم واجهات العرض المعتمدة على الأصناف في رحلة Django على Coddy. الدرس 11 من 18.

انشر وظيفة، وسيحفظها Django ثم يتوقف: No URL to redirect to. بعد الحفظ، يعيد CreateView التوجيه إلى success_url الخاص به. إذا لم يكن هناك واحد، فسيطلب من الصف الجديد عنوانه عبر دالة النموذج get_absolute_url().

يعتمد عنوان صفحة الصف على الصف نفسه، لذا مكان هذه الدالة هو النموذج. أنشئه باستخدام reverse()، الذي يحوّل اسم المسار ووسائطه إلى عنوان URL، كما يفعل {% url %} في القالب:

class Recipe(models.Model):
    ...

    def get_absolute_url(self):
        return reverse("recipes:recipe", kwargs={"pk": self.pk})

مرّر الوسائط بأسمائها باستخدام kwargs={...}، أو بالترتيب باستخدام args=[...]، واستورد reverse من django.urls. يمكن للقالب إنشاء رابط باستخدام {{ recipe.get_absolute_url }}، كما ينتقل UpdateView إلى ذلك العنوان أيضًا.

challenge icon

التحدي

متوسط

بعد نشر الوظيفة، ينبغي أن تنتقل إلى صفحتها في المتصفح. في jobs/models.py، أضف إلى Job دالة get_absolute_url() تُعيد عنوان URL لصفحتها، وهو المسار jobs:detail. يأخذ هذا المسار مُعرّف الوظيفة اللطيف (slug)، وليس مفتاحها الأساسي (pk): تُعيد وظيفة Tea Taster لدى Leafy العنوان /jobs/tea-taster-leafy/. اترك JobCreateView كما هو.

انشر وظيفة: ستنتقل إلى صفحتها.

جرّب بنفسك

from datetime import date

from django.conf import settings
from django.db import models
from django.utils.text import slugify


class Job(models.Model):
    title = models.CharField(max_length=200)
    company = models.CharField(max_length=200)
    city = models.CharField(max_length=100)
    salary = models.PositiveIntegerField(help_text="Yearly, in euros.")
    description = models.TextField(blank=True)
    posted = models.DateField(default=date.today)
    slug = models.SlugField(max_length=220, unique=True, blank=True)
    posted_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="jobs",
    )

    def __str__(self):
        return f"{self.title} at {self.company}"

    def save(self, *args, **kwargs):
        # تحصل الوظيفة الجديدة على slug من عنوانها وشركتها: "python-developer-acme".
        if not self.slug:
            base = slugify(f"{self.title} {self.company}") or "job"
            slug = base
            n = 2
            while Job.objects.filter(slug=slug).exists():
                slug = f"{base}-{n}"
                n += 1
            self.slug = slug
        super().save(*args, **kwargs)
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس واجهات العرض المعتمدة على الأصناف

تدرّب بنفسك: Playground لـ Django