Menu
CoddyTech

投稿者を設定する

CoddyのDjangoジャーニー「クラスベースビュー」セクションの一部。レッスン 15/18。

すべてのJobにはposted_byフィールドがあり、新しい求人では空のままです。これはフォームフィールドにしてはいけません。そうしないと、誰でも他人の名前で投稿できてしまいます。ビューで値を設定します。

フォームが有効な場合、編集用ビューはform_valid(form)を呼び出し、行を保存してリダイレクトします。行を先に変更するには、これをオーバーライドします。レシピサイトでは、URLに含まれるレシピに各レビューを保存します。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に含めないでください。

Runを押し、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プレイグラウンド