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() الخاصة بالعرض، ولن يُنفَّذ أبدًا فحص تسجيل الدخول، ولن يظهر لك أي تحذير.
التحدي
متوسطيمكن للمستخدمين المسجّلين الدخول فقط نشر الوظائف وتعديلها أو حذفها. في 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")
جميع دروس واجهات العرض المعتمدة على الأصناف
4عروض التحرير
CreateViewالانتقال إلى الوظيفة الجديدةتدرّب بنفسك: Playground لـ Django