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 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.

challenge icon

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

Übe selbstständig: Django-Playground