Ваша страница вакансий
Часть раздела Представления на основе классов путешествия по 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
Все уроки раздела Представления на основе классов
2Универсальные представления для отображения
ListViewDetailViewПотренируйтесь самостоятельно: Песочница Django