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ıfa @login_required ekleyebileceğin tek bir işlev yoktur; bu yüzden Django sana bir mixin sunar: ek bir davranış kazandırmak için bir 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 öncelikli olur, 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. jobs/views.py içinde LoginRequiredMixin öğesini JobCreateView, JobUpdateView ve JobDeleteView sınıflarına ekle. İş ilanları listesi ve ilan sayfaları herkese açık kalır.
Post a job öğesine tıkla: oturum açma sayfasına yönlendirilirsin; burada ada, coddy-pass-123 ile oturum açar.
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