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

Все уроки раздела Представления на основе классов

Потренируйтесь самостоятельно: Песочница Django