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.
Görev
OrtaYalnızca oturum açmış kullanıcılar iş ilanı yayınlayabilir, düzenleyebilir veya silebilir:
LoginRequiredMixinöğesiniJobCreateView,JobUpdateViewveJobDeleteViewöğ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
4Düzenleme Görünümleri
Oluşturma GörünümüYeni İş İlanına GeçişKendi başına pratik yap: Django playground