صفحة وظائفك
جزء من قسم واجهات العرض المعتمدة على الأصناف في رحلة Django على Coddy. الدرس 17 من 18.
يريد الناشرون مكانًا واحدًا للوظائف التي نشروها. تعرض القائمة بالفعل للمستخدمين المسجلين رابط Your jobs إلى /my-jobs/، لكن لا توجد صفحة هناك بعد.
من هنا، أنشئ ما تعلمته في هذا القسم دون مثال. الصفحة قائمة، لذا فهي ListView. تعتمد صفوفها على من يطلبها، لذا يتم اختيارها في get_queryset()، حيث يتوفر self.request.user. المستخدم المسجل وحده لديه وظائف ليراها. خصص لها قالبًا خاصًا بها: jobs/job_list.html مخصص للقائمة العامة.
التحدي
متوسطامنح كل ناشر صفحةً تعرض وظائفه.
- في
jobs/views.py، أضفMyJobsViewللمستخدمين الذين سجّلوا الدخول فقط. تعرض وظائفهم، من الأحدث إلى الأقدم، في صفحة واحدة. - أنشئ
jobs/my_jobs.htmlانطلاقًا منjobs/base.html: عنصر<h1>يحتوي علىYour jobs، ثم عنصر<li class="job">لكل وظيفة، ويكون العنوان داخل<strong>. إذا لم توجد وظائف، اعرضYou have not posted a job yet. - في
jobs/urls.py، أضفmy-jobs/بالاسمmine.
سجّل الدخول باسم ada (coddy-pass-123) واضغط على Your jobs: ستظهر لك وظائفها الست.
جرّب بنفسك
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
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(LoginRequiredMixin, CreateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
def form_valid(self, form):
form.instance.posted_by = self.request.user
return super().form_valid(form)
class JobUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
def test_func(self):
return self.get_object().posted_by == self.request.user
class JobDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Job
success_url = reverse_lazy("jobs:list")
def test_func(self):
return self.get_object().posted_by == self.request.user
جميع دروس واجهات العرض المعتمدة على الأصناف
تدرّب بنفسك: Playground لـ Django