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() של התצוגה עצמה גוברת, בדיקת ההתחברות כלל לא מתבצעת, ושום דבר לא מזהיר אותך.
אתגר
בינונירק משתמשים מחוברים רשאים לפרסם, לערוך או למחוק משרות:
- הוסיפו את
LoginRequiredMixinאלJobCreateView,JobUpdateViewו־JobDeleteView. - רשימת המשרות ודפי המשרות נשארים פתוחים לכולם.
לחצו על Run ולאחר מכן לחצו על 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 אונליין