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

אתגר

בינוני

רק מי שפרסם את המשרה רשאי לערוך אותה או למחוק אותה:

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

לחץ על Run, התחבר בתור grace ופתח את דף העריכה שלמעלה.

נסו בעצמכם

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 אונליין