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.
Défi
FacileDans 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
4Vues de modification
CreateViewArriver sur la nouvelle offre d'emploiEntraînez-vous par vous-même : Playground Django