Menu
CoddyTech

LoginRequiredMixin

本课属于 Coddy Django 学习旅程的“基于类的视图”单元。第 14 课,共 18 课。

现在,任何人都可以在没有账户的情况下发布、编辑或删除职位。类没有一个可以添加 @login_required 的单独函数,因此 Django 提供了一个混入类:你可以把这个小类添加到视图的父类中,以增加一种行为。

from django.contrib.auth.mixins import LoginRequiredMixin


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

现在,未登录的访客在视图运行前会被发送到 /accounts/login/?next=/recipes/new/,无论是 GET 还是 POST 请求都一样。登录后,next 会将他们带回原来的页面。

混入类要放在最前面。每个视图都会从一个名为 dispatch() 的方法开始,Python 会从左到右在父类中查找这个方法。如果写成 (CreateView, LoginRequiredMixin),视图自身的 dispatch() 就会优先执行,登录检查永远不会运行,而且也不会有任何警告。

challenge icon

挑战

中等

只有已登录的用户才能发布、编辑或删除职位。在 jobs/views.py 中,将 LoginRequiredMixin 添加到 JobCreateView、JobUpdateView 和 JobDeleteView。所有人都可以访问职位列表和职位页面。

点击 Post a job:你会进入登录页面,ada 使用 coddy-pass-123 登录。

亲手试试

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

基于类的视图中的所有课

自己练习: Django 在线编辑器