Menu
CoddyTech

רק מפרסם המשרה יכול לערוך

חלק מהיחידה תצוגות מבוססות מחלקות במסלול ה-Django של Coddy. שיעור 16 מתוך 18.

התחברו בתור grace ופתחו את /jobs/python-developer-brightline/edit/: ada פרסמה את המשרה הזאת, ו-grace יכולה לערוך אותה. בדפי משרות מוצג Edit רק למי שפרסם את המשרה, אבל כל אחד יכול להקליד את הכתובת או לשלוח בקשת POST, ולכן התצוגה עצמה חייבת לסרב.

UserPassesTestMixin קורא למתודה שאתם כותבים, test_func(), לפני שהתצוגה פועלת. כשהיא מחזירה True, הבקשה עוברת. כשהיא מחזירה False, משתמש מחובר מקבל תגובת 403 Forbidden, גם בבקשת GET וגם בבקשת POST. באתר מתכונים איש אינו יכול לשנות מתכון שפורסם:

class RecipeUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Recipe
    fields = ["title", "minutes"]

    def test_func(self):
        return not self.get_object().published

הבדיקה מתבצעת לפני שהתצוגה איתרה את השורה, ולכן self.object עדיין לא קיים. self.get_object() מאתר את השורה לפי כתובת ה-URL, כפי שהתצוגה תעשה.

challenge icon

אתגר

בינוני

רק מי שפרסם את המשרה רשאי לערוך או למחוק אותה. ב־jobs/views.py, הוסף את UserPassesTestMixin אל JobUpdateView ואל JobDeleteView, אחרי LoginRequiredMixin. הבדיקה עוברת רק עבור המשתמש שפרסם את המשרה, וכל אדם אחר מקבל 403 Forbidden, גם בבקשת GET וגם בבקשת POST.

התחבר בתור grace (coddy-pass-123) ופתח את /jobs/python-developer-brightline/edit/: ada פרסמה אותה, ולכן תראה 403 Forbidden.

נסו בעצמכם

from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.views.generic import CreateView, DeleteView, DetailView, ListView, TemplateView, UpdateView

from .models import Job


class HomeView(TemplateView):
    template_name = "jobs/home.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["count"] = Job.objects.count()
        context["latest"] = Job.objects.order_by("-posted").first()
        return context


class AboutView(TemplateView):
    template_name = "jobs/about.html"


class JobListView(ListView):
    model = Job
    context_object_name = "jobs"
    ordering = ["-posted"]
    paginate_by = 5

    def get_queryset(self):
        jobs = super().get_queryset()
        city = self.request.GET.get("city")
        if city:
            jobs = jobs.filter(city=city)
        return jobs


class JobDetailView(DetailView):
    model = Job


class JobCreateView(LoginRequiredMixin, CreateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]

    def form_valid(self, form):
        form.instance.posted_by = self.request.user
        return super().form_valid(form)


class JobUpdateView(LoginRequiredMixin, UpdateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]


class JobDeleteView(LoginRequiredMixin, DeleteView):
    model = Job
    success_url = reverse_lazy("jobs:list")
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תצוגות מבוססות מחלקות

תרגלו בעצמכם: Django אונליין