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.
  • تظل قائمة الوظائف وصفحات الوظائف مفتوحة للجميع.

اضغط على «تشغيل»، ثم اضغط على 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")

جميع دروس واجهات العرض المعتمدة على الأصناف

تدرّب بنفسك: Playground لـ Django