Sua página de vagas
Parte da seção Views baseadas em classes do Journey de Django da Coddy. Lição 17 de 18.
Quem publica vagas quer ter um lugar para ver as vagas que publicou. O menu já mostra aos usuários conectados um link Your jobs para /my-jobs/, mas ainda não há nada para atendê-lo.
A partir daqui, você constrói com o que esta seção ensinou, sem um exemplo. A página é uma lista, então é uma ListView. As linhas dependem de quem faz a solicitação, então são escolhidas em get_queryset(), onde self.request.user está disponível. Só um usuário conectado tem vagas para ver. Dê a ela um template próprio: jobs/job_list.html pertence à lista pública.
Desafio
MédioAdicione /my-jobs/, uma rota chamada mine:
- Visitantes desconectados são enviados para fazer login.
- Um usuário vê o título
Your jobse todas as suas vagas em uma única página, da mais recente para a mais antiga, cada uma em<li class="job">com o título em<strong>. - Se não houver nenhuma:
You have not posted a job yet.
Pressione Run, faça login como ada e pressione Your jobs.
Experimente você mesmo
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
Todas as lições de Views baseadas em classes
Pratique por conta própria: Playground de Django