Menu
CoddyTech

LoginRequiredMixin

Coddy'nin Django Journey'sinin Sınıf Tabanlı Görünümler bölümünün bir parçası. Ders 14 / 18.

Şu anda herkes bir hesap olmadan iş ilanı yayınlayabilir, düzenleyebilir veya silebilir. Bir sınıfın üzerine @login_required ekleyebileceğin tek bir işlevi yoktur; bu yüzden Django sana bir mixin sunar: tek bir ek davranış kazandırmak için görünümün üst sınıflarına eklediğin küçük bir sınıf.

from django.contrib.auth.mixins import LoginRequiredMixin


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

Oturum açmamış bir ziyaretçi artık görünüm çalıştırılmadan önce, hem GET hem de POST isteklerinde /accounts/login/?next=/recipes/new/ adresine yönlendirilir. Oturum açtıktan sonra next onları geri getirir.

Mixin ilk sırada yer alır. Her görünüm dispatch() adlı bir yöntemle başlar ve Python bu yöntemi üst sınıflarda soldan sağa arar. (CreateView, LoginRequiredMixin) şeklinde yazıldığında görünümün kendi dispatch() yöntemi öncelik kazanır, oturum açma denetimi hiç çalışmaz ve hiçbir uyarı almazsın.

challenge icon

Görev

Orta

Yalnızca oturum açmış kullanıcılar iş ilanı yayınlayabilir, düzenleyebilir veya silebilir:

  • LoginRequiredMixin öğesini JobCreateView, JobUpdateView ve JobDeleteView öğelerine ekleyin.
  • İş ilanları listesi ve iş ilanı sayfaları herkese açık kalır.

Run'a basın ve Post a job öğesine basın: giriş sayfasına yönlendirilirsiniz. ada kullanıcı adıyla, coddy-pass-123 parolasıyla giriş yapın.

Kendin dene

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

Sınıf Tabanlı Görünümler bölümündeki tüm dersler

Kendi başına pratik yap: Django playground