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

אתגר

בינוני

רק משתמשים מחוברים רשאים לפרסם, לערוך או למחוק משרות:

  • הוסיפו את 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")

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

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