龙空技术网

Django4.1学习笔记2023-7-29在基于类的视图中使用混入

不易9093 33

前言:

眼前小伙伴们对“django中几个html互相跳转”大概比较关切,姐妹们都想要剖析一些“django中几个html互相跳转”的相关知识。那么小编在网络上网罗了一些有关“django中几个html互相跳转””的相关知识,希望同学们能喜欢,咱们快快来学习一下吧!

Django官方网站

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 LoginRequiredMixinfrom django.views.generic import TemplateViewclass 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 UserPassesTestMixinfrom django.views.generic import TemplateViewclass 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 PermissionRequiredMixinfrom django.views.generic import TemplateViewclass 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 ObjectPermissionRequiredMixinfrom django.views.generic import TemplateViewfrom myapp.models import BlogPostfrom myapp.permissions import CanDeleteBlogPostPermissionclass 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 TemplateViewclass AboutView(TemplateView):    template_name = 'about.html'

解释:上述代码定义了一个名为AboutView的视图类,继承自TemplateView。template_name属性指定了要渲染的模板文件名为"about.html"。通过访问/about路径,可以将该视图渲染的模板展示给用户。

示例代码2 - 使用DetailView展示对象详情:

from django.views.generic import DetailViewfrom .models import Postclass 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 ListViewfrom .models import Postclass 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 FormViewfrom .forms import ContactFormclass 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/"。

这些示例代码展示了不同混合类的使用方法和属性设置,可以根据实际需求进行适当修改和扩展。请注意,示例代码中的模板文件名和模型类需要根据实际情况进行调整。

标签: #django中几个html互相跳转 #form提交不跳转 #form 提交不跳转