الانتقال إلى الوظيفة الجديدة
جزء من قسم واجهات العرض المعتمدة على الأصناف في رحلة 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 إلى ذلك العنوان أيضًا.
التحدي
متوسطبعد نشر الوظيفة، ينبغي أن تنتقل إلى صفحتها في المتصفح:
- في
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)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس واجهات العرض المعتمدة على الأصناف
4عروض التحرير
CreateViewالانتقال إلى الوظيفة الجديدةتدرّب بنفسك: Playground لـ Django