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 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.

challenge icon

Desafio

Médio

Adicione /my-jobs/, uma rota chamada mine:

  • Visitantes desconectados são enviados para fazer login.
  • Um usuário vê o título Your jobs e 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