רק מפרסם המשרה יכול לערוך
חלק מהיחידה תצוגות מבוססות מחלקות במסלול ה-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, כפי שהתצוגה תעשה.
אתגר
בינונירק מי שפרסם את המשרה רשאי לערוך או למחוק אותה. ב־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")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תצוגות מבוססות מחלקות
4תצוגות לעריכה
CreateViewהגעה למשרה החדשהתרגלו בעצמכם: Django אונליין