Menu
CoddyTech

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() של התצוגה עצמה מנצחת, בדיקת ההתחברות לעולם לא רצה, ושום דבר לא מזהיר אותך.

challenge icon

אתגר

בינוני

רק משתמשים מחוברים יכולים לפרסם, לערוך או למחוק משרות. ב־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")

כל השיעורים ביחידה תצוגות מבוססות מחלקות

תרגלו בעצמכם: Django אונליין