Назначение автора объявления
Часть раздела Представления на основе классов путешествия по Django на Coddy. Урок 15 из 18.
У каждого Job есть поле posted_by, а у новых вакансий оно пустое. Это поле не должно быть полем формы, иначе кто угодно сможет публиковать вакансии от имени другого человека. Представление заполняет его.
Если форма корректна, представление редактирования вызывает form_valid(form), который сохраняет запись и выполняет перенаправление. Переопределите его, чтобы сначала изменить запись. Сайт с рецептами сохраняет каждый отзыв к рецепту, указанному в 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 — это ещё не сохранённая запись. self.kwargs содержит аргументы URL; они нужны только в этом примере, чтобы найти рецепт. Задайте поле, а затем позвольте super().form_valid(form) сохранить запись и выполнить перенаправление. Если задать поле после вызова super(), запись уже будет сохранена без него.
Задание
ЛегкоВ JobCreateView переопределите form_valid(), чтобы у новой вакансии posted_by был равен вошедшему в систему пользователю. Не включайте posted_by в fields.
Войдите как grace (coddy-pass-123) и разместите вакансию: на её странице после даты будет написано by grace.
Попробуйте сами
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")
Все уроки раздела Представления на основе классов
4Редактирование представлений
CreateViewПереход к новой вакансии2Универсальные представления для отображения
ListViewDetailViewПотренируйтесь самостоятельно: Песочница Django