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 champ 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 redirige. Surcharge cette méthode 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. self.kwargs contient les arguments de l’URL ; seul cet exemple en a besoin pour trouver la recette. Définis ton champ, puis laisse super().form_valid(form) enregistrer et rediriger. Si tu le définis après super(), la ligne est déjà enregistrée sans cette valeur.
Défi
FacileDans JobCreateView, redéfinis form_valid() afin que le champ posted_by d’une nouvelle offre d’emploi corresponde à l’utilisateur connecté. Ne mets pas posted_by dans fields.
Connecte-toi en tant que grace (coddy-pass-123) et publie 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
4Vues de modification
CreateViewArriver sur la nouvelle offre d'emploiEntraînez-vous par vous-même : Playground Django