LoginRequiredMixin
חלק מהיחידה תצוגות מבוססות מחלקות במסלול ה-Django של Coddy. שיעור 14 מתוך 18.
כרגע כל אחד יכול לפרסם משרה, לערוך אותה או למחוק אותה בלי חשבון. למחלקה אין פונקציה יחידה שאפשר להצמיד לה את @login_required, ולכן Django נותן לך מיקסין: מחלקה קטנה שמוסיפים למחלקות האב של תצוגה כדי להוסיף לה התנהגות אחת.
from django.contrib.auth.mixins import LoginRequiredMixin
class RecipeCreateView(LoginRequiredMixin, CreateView):
model = Recipe
fields = ["title", "minutes"]מבקר שלא מחובר מועבר עכשיו אל /accounts/login/?next=/recipes/new/ לפני שהתצוגה רצה, גם בבקשת GET וגם בבקשת POST. לאחר ההתחברות, next מחזיר אותו.
המיקסין מופיע ראשון. כל תצוגה מתחילה במתודה שנקראת dispatch(), ו-Python מחפשת אותה במחלקות האב משמאל לימין. אם כותבים (CreateView, LoginRequiredMixin), המתודה dispatch() של התצוגה עצמה מנצחת, בדיקת ההתחברות לעולם לא רצה, ושום דבר לא מזהיר אותך.
אתגר
בינונירק משתמשים מחוברים יכולים לפרסם, לערוך או למחוק משרות. ב־jobs/views.py, הוסף את LoginRequiredMixin אל JobCreateView, JobUpdateView ו־JobDeleteView. רשימת המשרות ודפי המשרות נשארים פתוחים לכולם.
לחץ על Post a job: תועבר לדף ההתחברות, שבו ada מתחברת באמצעות coddy-pass-123.
נסו בעצמכם
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(CreateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
class JobUpdateView(UpdateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
class JobDeleteView(DeleteView):
model = Job
success_url = reverse_lazy("jobs:list")
כל השיעורים ביחידה תצוגות מבוססות מחלקות
4תצוגות לעריכה
CreateViewהגעה למשרה החדשהתרגלו בעצמכם: Django אונליין