Menu
CoddyTech

LoginRequiredMixin

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

Saat ini, siapa pun bisa membuat, mengedit, atau menghapus pekerjaan tanpa akun. class tidak memiliki satu fungsi khusus untuk memasang @login_required, jadi Django menyediakan mixin: class kecil yang kamu tambahkan ke parent sebuah view untuk menambahkan satu perilaku.

from django.contrib.auth.mixins import LoginRequiredMixin


class RecipeCreateView(LoginRequiredMixin, CreateView):
    model = Recipe
    fields = ["title", "minutes"]

Sekarang pengunjung yang belum login akan diarahkan ke /accounts/login/?next=/recipes/new/ sebelum view dijalankan, baik untuk GET maupun POST. Setelah login, next akan mengembalikan mereka ke halaman sebelumnya.

Mixin harus diletakkan pertama. Setiap view dimulai dari method bernama dispatch(), dan Python mencari method tersebut pada parent dari kiri ke kanan. Jika ditulis (CreateView, LoginRequiredMixin), dispatch() milik view itu sendiri yang dijalankan, pemeriksaan login tidak pernah dijalankan, dan kamu tidak mendapat peringatan.

challenge icon

Tantangan

Sedang

Hanya pengguna yang sudah login yang boleh memposting, mengedit, atau menghapus lowongan kerja:

  • Tambahkan LoginRequiredMixin ke JobCreateView, JobUpdateView, dan JobDeleteView.
  • Daftar lowongan kerja dan halaman lowongan kerja tetap terbuka untuk semua orang.

Tekan Jalankan, lalu tekan Post a job: kamu akan diarahkan ke halaman login. Login sebagai ada, dengan kata sandi coddy-pass-123.

Coba sendiri

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(CreateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]


class JobUpdateView(UpdateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]


class JobDeleteView(DeleteView):
    model = Job
    success_url = reverse_lazy("jobs:list")

Semua pelajaran di View Berbasis Class

Latihan sendiri: Playground Django