Menu
CoddyTech

Menetapkan Pembuat Postingan

Termasuk bagian View Berbasis Class dalam perjalanan Django di Coddy. Pelajaran 15 dari 18.

Setiap Job memiliki field posted_by, dan pekerjaan baru membiarkannya kosong. Field ini tidak boleh menjadi field formulir, atau siapa pun bisa membuat postingan atas nama orang lain. View akan mengisinya.

Untuk formulir yang valid, view pengeditan memanggil form_valid(form), yang menyimpan baris dan mengalihkan. Ganti metode ini untuk mengubah baris terlebih dahulu. Situs resep menyimpan setiap ulasan pada resep yang ada di URL-nya, 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 adalah baris yang belum disimpan. self.kwargs menyimpan argumen URL. Hanya contoh ini yang membutuhkannya untuk menemukan resep. Tetapkan field-mu, lalu biarkan super().form_valid(form) menyimpan dan mengalihkan. Jika kamu menetapkannya setelah super(), barisnya sudah telanjur disimpan tanpanya.

challenge icon

Tantangan

Mudah

Di JobCreateView, ganti form_valid() agar posted_by untuk lowongan baru berisi pengguna yang sudah masuk. Jangan masukkan posted_by ke dalam fields.

Masuk sebagai grace (coddy-pass-123) dan posting lowongan: halamannya menampilkan by grace setelah tanggal.

Coba sendiri

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

Semua pelajaran di View Berbasis Class

Latihan sendiri: Playground Django