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")

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

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