Menu
CoddyTech

صفحة وظائفك

جزء من قسم واجهات العرض المعتمدة على الأصناف في رحلة Django على Coddy. الدرس 17 من 18.

يريد الناشرون مكانًا واحدًا للوظائف التي نشروها. تعرض القائمة بالفعل للمستخدمين المسجلين رابط Your jobs إلى /my-jobs/، لكن لا توجد صفحة هناك بعد.

من هنا، أنشئ ما تعلمته في هذا القسم دون مثال. الصفحة قائمة، لذا فهي ListView. تعتمد صفوفها على من يطلبها، لذا يتم اختيارها في get_queryset()، حيث يتوفر self.request.user. المستخدم المسجل وحده لديه وظائف ليراها. خصص لها قالبًا خاصًا بها: jobs/job_list.html مخصص للقائمة العامة.

challenge icon

التحدي

متوسط

امنح كل ناشر صفحةً تعرض وظائفه.

  1. في jobs/views.py، أضف MyJobsView للمستخدمين الذين سجّلوا الدخول فقط. تعرض وظائفهم، من الأحدث إلى الأقدم، في صفحة واحدة.
  2. أنشئ jobs/my_jobs.html انطلاقًا من jobs/base.html: عنصر <h1> يحتوي على Your jobs، ثم عنصر <li class="job"> لكل وظيفة، ويكون العنوان داخل <strong>. إذا لم توجد وظائف، اعرض You have not posted a job yet.
  3. في 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