Menetapkan Pembuat Postingan
Termasuk bagian View Berbasis Class dalam perjalanan Django di Coddy. Pelajaran 15 dari 18.
Setiap Job memiliki field posted_by, dan lowongan baru membiarkannya kosong. Field tersebut tidak boleh menjadi field formulir, atau siapa pun bisa memasang lowongan atas nama orang lain. View mengisinya.
Untuk formulir yang valid, view pengeditan memanggil form_valid(form), yang menyimpan baris dan mengalihkan halaman. Ganti fungsi tersebut untuk mengubah baris terlebih dahulu. Situs resep menyimpan setiap ulasan pada resep yang tercantum 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, dan self.kwargs menyimpan argumen URL. Atur field-mu, lalu biarkan super().form_valid(form) menyimpan dan mengalihkan halaman. Jika kamu mengaturnya setelah super(), baris sudah telanjur disimpan tanpanya.
Tantangan
MudahDi JobCreateView, timpa form_valid() agar posted_by untuk lowongan baru berisi pengguna yang sudah masuk. Jangan masukkan posted_by ke dalam fields.
Tekan Run, masuk sebagai grace (coddy-pass-123), lalu buat 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
4Mengedit View
CreateViewMenuju Pekerjaan Baru2Tampilan Generik untuk Menampilkan Data
ListViewDetailViewLatihan sendiri: Playground Django