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 bleibt es leer. Es darf kein Formularfeld sein, sonst könnte jeder im Namen einer anderen Person posten. Die Ansicht füllt es aus.
Bei einem gültigen Formular ruft eine Bearbeitungsansicht form_valid(form) auf, wodurch der Datensatz gespeichert und eine Weiterleitung ausgelöst wird. Überschreibe die Methode, um zuerst den Datensatz zu ändern. Eine Rezeptseite speichert jede Bewertung beim Rezept, dessen URL sie enthält, 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. self.kwargs enthält die URL-Argumente; nur dieses Beispiel benötigt sie, um das Rezept zu finden. Setze dein Feld und lass dann super().form_valid(form) speichern und weiterleiten. Setzt du es nach super(), ist der Datensatz bereits ohne diesen Wert gespeichert.
Aufgabe
EinfachÜberschreibe in JobCreateView form_valid(), sodass bei einem neuen Job posted_by der angemeldete Benutzer ist. Nimm posted_by nicht in fields auf.
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