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.
  • اترك 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