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