Menu
CoddyTech

Définir l'annonceur

Fait partie de la section Vues basées sur des classes du Journey Django de Coddy. Leçon 15 sur 18.

Chaque Job possède un champ posted_by, et les nouveaux emplois le laissent vide. Ce ne doit pas être un champ de formulaire, sinon n’importe qui pourrait publier au nom de quelqu’un d’autre. La vue le renseigne.

Pour un formulaire valide, une vue d’édition appelle form_valid(form), qui enregistre la ligne et effectue une redirection. Redéfinissez-la pour modifier d’abord la ligne. Un site de recettes enregistre chaque avis sur la recette indiquée dans son 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 est la ligne non enregistrée, et self.kwargs contient les arguments de l’URL. Définissez votre champ, puis laissez super().form_valid(form) enregistrer et effectuer la redirection. Si vous le définissez après super(), la ligne est déjà enregistrée sans cette valeur.

challenge icon

Défi

Facile

Dans JobCreateView, redéfinissez form_valid() afin que le posted_by d’une nouvelle offre d’emploi corresponde à l’utilisateur connecté. Ne mettez pas posted_by dans fields.

Cliquez sur Run, connectez-vous en tant que grace (coddy-pass-123) et publiez une offre d’emploi : sa page affiche by grace après la date.

Essayez vous-même

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")

Toutes les leçons de Vues basées sur des classes

Entraînez-vous par vous-même : Playground Django