Django官方网站
https://docs.djangoproject.com/zh-hans/4.1/topics/class-based-views/mixins/
Django 4.1 引入了基于类的视图(Class-Based Views,简称 CBV),它是一种更加灵活和可重用的方式来处理 Web 应用程序中的请求和响应。CBV 提供了一种将视图逻辑封装在类中的方法,使得代码更加模块化和易于维护。
在 CBV 中,我们可以使用一些内置的mixin类来扩展视图的功能。这些mixin类提供了一些可重用的组件,例如权限控制、表单处理、分页等。通过组合这些mixin类,我们可以轻松地为视图添加所需的功能。
下面是页面中提到的四种 mixin 类:
- LoginRequiredMixin:这个mixin类用于检查用户是否已经登录。如果用户未登录,则重定向到登录页面。
- UserPassesTestMixin:这个mixin类用于检查用户是否满足某些条件。如果用户满足条件,则允许访问视图;否则,返回一个错误响应。
- PermissionRequiredMixin:这个mixin类用于检查用户是否具有某个权限。如果用户没有权限,则返回一个错误响应。
- ObjectPermissionRequiredMixin:这个mixin类用于检查用户是否具有对某个对象的某个权限。如果用户没有权限,则返回一个错误响应。
下面是这四种 mixin 类的详细解释和样例代码:
- LoginRequiredMixin:
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import TemplateView
class ProtectedView(LoginRequiredMixin, TemplateView):
template_name = 'protected.html'
在这个例子中,我们首先从 django.contrib.auth.mixins 模块导入了 LoginRequiredMixin 类。然后,我们创建了一个名为 ProtectedView 的类,它继承了 LoginRequiredMixin 和 TemplateView。这样,当用户访问这个视图时,Django 会自动检查用户是否已经登录。如果用户未登录,则重定向到登录页面;否则,渲染模板文件 protected.html。
- UserPassesTestMixin:
from django.contrib.auth.mixins import UserPassesTestMixin
from django.views.generic import TemplateView
class AdminView(UserPassesTestMixin, TemplateView):
template_name = 'admin.html'
login_url = '/login/'
redirect_field_name = 'next'
def test_func(self):
return self.request.user.is_staff
在这个例子中,我们首先从 django.contrib.auth.mixins 模块导入了 UserPassesTestMixin 类。然后,我们创建了一个名为 AdminView 的类,它继承了 UserPassesTestMixin 和 TemplateView。这样,当用户访问这个视图时,Django 会自动检查用户是否具有管理员权限。如果用户具有管理员权限,则允许访问视图;否则,重定向到登录页面。同时,我们还可以通过设置 login_url、redirect_field_name 等属性来自定义登录页面、重定向字段等。
- PermissionRequiredMixin:
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.views.generic import TemplateView
class CanEditBlogPostView(PermissionRequiredMixin, TemplateView):
permission_required = 'blogapp.change_blogpost'
template_name = 'edit_blogpost.html'
在这个例子中,我们首先从 django.contrib.auth.mixins 模块导入了 PermissionRequiredMixin 类。然后,我们创建了一个名为 CanEditBlogPostView 的类,它继承了 PermissionRequiredMixin 和 TemplateView。这样,当用户访问这个视图时,Django 会自动检查用户是否具有编辑博客文章的权限。如果用户具有权限,则允许访问视图;否则,返回一个错误响应。同时,我们还可以通过设置 permission_required 属性来指定所需的权限。
- ObjectPermissionRequiredMixin:
from django.contrib.auth.mixins import ObjectPermissionRequiredMixin
from django.views.generic import TemplateView
from myapp.models import BlogPost
from myapp.permissions import CanDeleteBlogPostPermission
class CanDeleteBlogPostView(ObjectPermissionRequiredMixin, TemplateView):
permission_required = CanDeleteBlogPostPermission()
template_name = 'delete_blogpost.html'
queryset = BlogPost.objects.all()
在这个例子中,我们首先从 django.contrib.auth.mixins、myapp.models、和 myapp.permissions 分别导入了 ObjectPermissionRequiredMixin、BlogPost、和 CanDeleteBlogPostPermission。然后,我们创建了一个名为 CanDeleteBlogPostView 的类,它继承了 ObjectPermissionRequiredMixin、TemplateView、和 BlogPost. 这样,当用户访问这个视图时,Django 会自动检查用户是否具有删除博客文章的权限。如果用户具有权限,则允许访问视图;否则,返回一个错误响应。同时,我们还可以通过设置 permission_required、queryset属性来指定所需的权限和查询集。这样,我们可以为不同的视图提供不同的权限控制和数据查询功能。
总之,Django 4.1 引入了基于类的视图(CBV),使得代码更加模块化、可重用和易于维护。通过使用内置的 mixin 类,我们可以轻松地为视图添加所需的功能,例如权限控制、表单处理、分页等。这有助于提高代码的可读性和可维护性,同时也可以减少重复代码的编写。
版本的Django是3.2,而不是4.1。请参考以下内容关于Django 3.2版本的解释和示例代码。
在Django官方文档的"Class-based views"部分,有一个子主题"Mixins",该主题介绍了Django中的视图混合类(mixins)。视图混合类是一种通过组合和重用代码来扩展和定制类视图的方法。
页面中的代码主要是对视图混合类的使用进行了说明。首先介绍了django.views.generic.base.View类,这是所有视图类的基类。然后介绍了几个常用的混合类,包括TemplateView、DetailView、ListView、FormView等。
每个混合类的代码示例都提供了详细的说明。以TemplateView为例,它是一个用于渲染模板的混合类。通过继承TemplateView,可以快速创建一个简单的视图,而无需手动编写处理逻辑。示例代码中展示了如何使用TemplateView来渲染一个名为"about.html"的模板。
除了提供示例代码,页面还解释了混合类的工作原理和用途。混合类可以通过多继承的方式,将不同的功能组合到一个视图中。例如,通过继承DetailView和FormView,可以创建一个既能展示对象详情又能处理表单提交的视图。
更详细的解释和示例代码可以在官方文档的链接中找到。以下是四种使用混合类的示例代码和说明:
- 示例代码1 - 使用TemplateView渲染静态页面:
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = 'about.html'
解释:上述代码定义了一个名为AboutView的视图类,继承自TemplateView。template_name属性指定了要渲染的模板文件名为"about.html"。通过访问/about路径,可以将该视图渲染的模板展示给用户。
- 示例代码2 - 使用DetailView展示对象详情:
from django.views.generic import DetailView
from .models import Post
class PostDetailView(DetailView):
model = Post
template_name = 'post_detail.html'
context_object_name = 'post'
解释:上述代码定义了一个名为PostDetailView的视图类,继承自DetailView。model属性指定了要展示的模型为Post。template_name属性指定了要渲染的模板文件名为"post_detail.html"。context_object_name属性指定了传递给模板的对象名称为"post"。
- 示例代码3 - 使用ListView展示对象列表:
from django.views.generic import ListView
from .models import Post
class PostListView(ListView):
model = Post
template_name = 'post_list.html'
context_object_name = 'posts'
paginate_by = 10
解释:上述代码定义了一个名为PostListView的视图类,继承自ListView。model属性指定了要展示的模型为Post。template_name属性指定了要渲染的模板文件名为"post_list.html"。context_object_name属性指定了传递给模板的对象列表名称为"posts"。paginate_by属性指定了每页显示的对象数量为10。
- 示例代码4 - 使用FormView处理表单提交:
from django.views.generic import FormView
from .forms import ContactForm
class ContactView(FormView):
form_class = ContactForm
template_name = 'contact.html'
success_url = '/thanks/'
解释:上述代码定义了一个名为ContactView的视图类,继承自FormView。form_class属性指定了要使用的表单类为ContactForm。template_name属性指定了要渲染的模板文件名为"contact.html"。success_url属性指定了表单提交成功后跳转的URL为"/thanks/"。
这些示例代码展示了不同混合类的使用方法和属性设置,可以根据实际需求进行适当修改和扩展。请注意,示例代码中的模板文件名和模型类需要根据实际情况进行调整。