Menu
CoddyTech

Назначение автора объявления

Часть раздела Представления на основе классов путешествия по 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(), запись уже будет сохранена без него.

challenge icon

Задание

Легко

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

Все уроки раздела Представления на основе классов

Потренируйтесь самостоятельно: Песочница Django