Menu
CoddyTech

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.

challenge icon

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

Übe selbstständig: Django-Playground