Menu
CoddyTech

Đăng tin tuyển dụng mới

Thuộc phần View dựa trên lớp trong hành trình Django của Coddy. Bài học 11 trên 18.

Đăng tin tuyển dụng, Django lưu tin rồi dừng lại: No URL to redirect to. Sau khi lưu, một CreateView chuyển hướng đến success_url của nó. Nếu không có địa chỉ này, nó sẽ hỏi hàng mới về địa chỉ của hàng đó thông qua một phương thức của mô hình (model), get_absolute_url().

Địa chỉ trang của một hàng phụ thuộc vào hàng đó, nên phương thức này thuộc về mô hình. Tạo địa chỉ bằng reverse(), hàm này chuyển tên và đối số của một tuyến đường thành URL, giống như {% url %} trong mẫu:

class Recipe(models.Model):
    ...

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

Truyền đối số theo tên bằng kwargs={...}, hoặc theo thứ tự bằng args=[...], đồng thời nhập reverse từ django.urls. Mẫu có thể tạo liên kết bằng {{ recipe.get_absolute_url }}, và một UpdateView cũng sẽ chuyển đến đó.

challenge icon

Thử thách

Trung bình

Sau khi đăng tin, trình duyệt sẽ mở trang của công việc mới. Trong jobs/models.py, thêm cho Job phương thức get_absolute_url() trả về URL của trang đó, tức tuyến đường jobs:detail. Tuyến đường này nhận slug của công việc, không phải pk: công việc Tea Taster tại Leafy trả về /jobs/tea-taster-leafy/. Giữ nguyên JobCreateView.

Đăng tin tuyển dụng: bạn sẽ được chuyển đến trang của công việc đó.

Tự làm thử

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):
        # Một công việc mới có slug tạo từ title và company: "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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong View dựa trên lớp

Tự luyện tập: Playground Django