Deine Jobseite
Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 17 von 18.
Veröffentlichende möchten eine zentrale Stelle für die von ihnen veröffentlichten Jobs. Das Menü zeigt angemeldeten Benutzern bereits einen Link Your jobs zu /my-jobs/, aber bisher gibt es dafür noch keine Antwort.
Von hier aus baust du mit dem auf, was dieser Abschnitt vermittelt hat, ohne ein Beispiel. 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 verfügbar ist. Nur ein angemeldeter Benutzer hat Jobs, die er sehen kann. Gib der Seite ein eigenes Template: jobs/job_list.html gehört zur öffentlichen Liste.
Aufgabe
MittelFüge /my-jobs/ hinzu, eine Route mit dem Namen mine:
- Abgemeldete Besucher werden zur Anmeldung weitergeleitet.
- Ein Benutzer sieht die Überschrift
Your jobsund alle eigenen Jobs auf einer Seite, die neuesten zuerst, jeweils in<li class="job">mit dem Titel in<strong>. - Wenn keine vorhanden sind:
You have not posted a job yet.
Drücke auf Run, melde dich als ada an und drücke auf Your jobs.
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