صفحة وظائفك
جزء من قسم واجهات العرض المعتمدة على الأصناف في رحلة Django على Coddy. الدرس 17 من 18.
يريد الناشرون مكانًا واحدًا للوظائف التي نشروها. تعرض القائمة بالفعل للمستخدمين المسجّلين الدخول رابط Your jobs المؤدي إلى /my-jobs/، لكن لا شيء يجيب عنه حتى الآن.
من هنا، أنشئ ما تحتاج إليه باستخدام ما علّمه هذا القسم، دون مثال. الصفحة قائمة، لذا فهي ListView. تعتمد صفوفها على من يطلبها، لذا تُختار في get_queryset()، حيث يكون self.request.user متاحًا. لا يملك وظائف ليراها إلا المستخدم المسجّل الدخول. خصّص لها قالبًا مستقلًا: jobs/job_list.html خاص بالقائمة العامة.
التحدي
متوسطأضف /my-jobs/، وهو مسار باسم mine:
- يُوجَّه الزوار الذين لم يسجّلوا الدخول إلى صفحة تسجيل الدخول.
- يرى المستخدم العنوان
Your jobsوجميع وظائفه في صفحة واحدة، بدءًا بالأحدث، وتظهر كل وظيفة داخل<li class="job">مع العنوان داخل<strong>. - إذا لم تكن لديه أي وظائف:
You have not posted a job yet.
اضغط على Run، وسجّل الدخول باسم ada، ثم اضغط على 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