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 um só lugar para ver as vagas que publicou. O menu já mostra aos usuários conectados um link Suas vagas para /my-jobs/, mas ainda não há nenhuma página nesse endereço.
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 solicita, então são escolhidas em get_queryset(), onde self.request.user está disponível. Somente 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édioDê a cada anunciante uma página com suas próprias vagas.
- Em
jobs/views.py, adicioneMyJobsView, somente para usuários conectados. Ela lista as vagas deles, da mais recente para a mais antiga, em uma página. - Crie
jobs/my_jobs.htmla partir dejobs/base.html: um<h1>Your jobs, depois um<li class="job">para cada vaga, com o título em<strong>. Se não houver nenhuma, mostreYou have not posted a job yet. - Em
jobs/urls.py, adicionemy-jobs/com o nomemine.
Entre como ada (coddy-pass-123) e pressione Your jobs: você verá as 6 vagas dela.
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