Den Ersteller festlegen
Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 15 von 18.
Jeder Job hat ein Feld posted_by, und bei neuen Jobs ist es leer. Es darf kein Formularfeld sein, sonst könnte jeder unter dem Namen einer anderen Person posten. Die View füllt es aus.
Bei einem gültigen Formular ruft eine Bearbeitungs-View form_valid(form) auf, wodurch der Datensatz gespeichert und eine Weiterleitung ausgelöst wird. Überschreibe sie, um zuerst den Datensatz zu ändern. Eine Rezept-Website speichert jede Bewertung für das Rezept in ihrer URL, recipes/<slug:slug>/review/:
class ReviewCreateView(LoginRequiredMixin, CreateView):
model = Review
fields = ["stars", "text"]
def form_valid(self, form):
recipe = get_object_or_404(Recipe, slug=self.kwargs["slug"])
form.instance.recipe = recipe
return super().form_valid(form)form.instance ist der noch nicht gespeicherte Datensatz, und self.kwargs enthält die URL-Argumente. Setze dein Feld und lass dann super().form_valid(form) speichern und weiterleiten. Setzt du es nach super(), ist der Datensatz bereits ohne dieses Feld gespeichert.
Aufgabe
EinfachÜberschreibe in JobCreateView form_valid(), damit bei einem neuen Job posted_by der angemeldete Benutzer ist. Lass posted_by aus fields heraus.
Klicke auf „Ausführen“, melde dich als grace (coddy-pass-123) an und veröffentliche einen Job: Auf seiner Seite steht nach dem Datum by grace.
Probier es selbst
from django.contrib.auth.mixins import LoginRequiredMixin
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"]
class JobUpdateView(LoginRequiredMixin, UpdateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
class JobDeleteView(LoginRequiredMixin, DeleteView):
model = Job
success_url = reverse_lazy("jobs:list")
Alle Lektionen in Klassenbasierte Views
4Ansichten bearbeiten
CreateViewAuf der neuen Stelle landenÜbe selbstständig: Django-Playground