Menu
CoddyTech

صفحة وظائفك

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

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

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

challenge icon

التحدي

متوسط

أضف /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