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. - تظل قائمة الوظائف وصفحات الوظائف مفتوحة للجميع.
اضغط على «تشغيل»، ثم اضغط على 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الانتقال إلى الوظيفة الجديدةتدرّب بنفسك: Playground لـ Django