Deine Jobseite
Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 17 von 18.
Poster möchten einen Ort für die von ihnen veröffentlichten Jobs haben. Das Menü zeigt angemeldeten Nutzern bereits einen Link Your jobs zu /my-jobs/, aber dort gibt es noch keine Seite.
Von hier aus baust du mit dem, was du in diesem Abschnitt gelernt hast, ohne Beispiel weiter. Die Seite ist eine Liste, also ist sie eine ListView. Ihre Zeilen hängen davon ab, wer fragt, daher werden sie in get_queryset() ausgewählt, wo self.request.user zur Verfügung steht. Nur ein angemeldeter Nutzer hat Jobs, die er sehen kann. Gib der Seite eine eigene Vorlage: jobs/job_list.html gehört zur öffentlichen Liste.
Aufgabe
MittelGib jeder Person, die Stellenanzeigen veröffentlicht, eine Seite mit ihren Stellenanzeigen.
- Füge in
jobs/views.pyMyJobsViewhinzu, nur für angemeldete Benutzer. Die Ansicht listet ihre Stellenanzeigen auf einer Seite auf, die neuesten zuerst. - Erstelle
jobs/my_jobs.htmlauf Grundlage vonjobs/base.html: ein<h1>mitYour jobs, dann ein<li class="job">pro Stellenanzeige, mit dem Titel in<strong>. Wenn es keine gibt, zeigeYou have not posted a job yet.an. - Füge in
jobs/urls.pymy-jobs/mit dem Namenminehinzu.
Melde dich als ada (coddy-pass-123) an und klicke auf Your jobs: Du siehst ihre 6 Stellenanzeigen.
Probier es selbst
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
Alle Lektionen in Klassenbasierte Views
Übe selbstständig: Django-Playground