Menu
CoddyTech

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.

challenge icon

Desafio

Médio

Dê a cada anunciante uma página com suas próprias vagas.

  1. Em jobs/views.py, adicione MyJobsView, somente para usuários conectados. Ela lista as vagas deles, da mais recente para a mais antiga, em uma página.
  2. Crie jobs/my_jobs.html a partir de jobs/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, mostre You have not posted a job yet.
  3. Em jobs/urls.py, adicione my-jobs/ com o nome mine.

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