Django之class-base view

本文介绍了Django的class-based views,重点讲解了View的工作原理,包括as_view()方法、setup()和dispatch()方法。此外,还详细阐述了TemplateView、ListView和DetailView的继承结构、方法流程,并给出了具体使用示例。

Django提供的class-base view

	View:基础的View,实现了基于HTTP方法的分发逻辑,不同的请求方法会调用相应的方法,
	即GET请求调用get方法,POST请求调用post方法
	TemplateView:继承自View,可以直接用来返回指定的模板,实现了get方法,可以传递变量
	到模板中来进行数据展示
	DetailView:继承子View,实现了get方法,可以通过绑定某一个模板,用来获取单个实例的
	数据
	ListView:继承子View,实现了get方法,可以通过绑定模板来批量获取数据

View
基于类的视图具有一个 as_view()类方法,该方法返回一个函数,当请求到达匹配的URL时,可以调用该函数。该函数创建类的实例,调用 setup()初始化其属性,然后调用其dispatch()方法。 dispatch查看请求以确定它是否为GET, POST等等,并将请求中继到匹配方法

from django.http import HttpResponse
from django.views import View

class MyView(View):
    def get(self, request):    
        return HttpResponse('result')
    def post(self, request):
    	return HttpResponse('result')
----------  urls 中的设置   ----------
	from django.urls import path
	from myapp.views import MyView
	
	urlpatterns = [
	    path('about/', MyView.as_view()),
	]

View的方法流程

	classmethodas_view(** initkwargs)
	返回一个可调用的视图,该视图接收请求并返回响应:response = MyView.as_view()(request)

	setup(request,* args,** kwargs)
	在dispatch()执行之前初始化实例属性:self.request,self.args,和self.kwargs。
	
	dispatch(request, *args, **kwargs)
	用来判断当前请求是否是受支持的HTTP请求,受支持的请求如下:
	http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
	
	http_method_not_allowed(request, *args, **kwargs)
	如果使用了不受支持的HTTP请求,就会执行此方法,返回错误信息
	
	options(request, *args, **kwargs)
	处理对http请求的响应。返回一个view允许的HTTP请求方式且包含一个list的标头的response
	Returns a response with the Allow header containing a list of the view’s allowed HTTP method names.

TemplateView
继承自以下几个视图

	django.views.generic.base.TemplateResponseMixin
	django.views.generic.base.ContextMixin
	django.views.generic.base.View

方法流程图

	setup()
	dispatch()
	http_method_not_allowed()
	get_context_data()
	获取渲染到模板中的所有上下文。如果有新增数据,可以通过重写该方法来实现

使用示例

	from django.views.generic.base import TemplateView
	from articles.models import Article

	class HomePageView(TemplateView):
	    template_name = "home.html"
	    def get_context_data(self, **kwargs):
	        context = super().get_context_data(**kwargs)
	        context['latest_articles'] = Article.objects.all()[:5]
	        return context
	------- urls  中的设置  -------------
	from django.urls import path
	from myapp.views import HomePageView

	urlpatterns = [
   		path('', HomePageView.as_view(), name='home'),
	]
	-------------- 直接在url中指定模板---------------
		from django.urls import path
	from myapp.views import HomePageView

	urlpatterns = [
   		path('', HomePageView.as_view(template_name="home.html"), name='home'),
	]

ListView
继承自以下几个视图

	django.views.generic.list.MultipleObjectTemplateResponseMixin
	django.views.generic.base.TemplateResponseMixin
	django.views.generic.list.BaseListView
	django.views.generic.list.MultipleObjectMixin
	django.views.generic.base.View

方法流程图

	setup()
	dispatch()
	http_method_not_allowed()
	get_template_names()
	返回呈现模板时要搜索的模板名称列表。将使用找到的第一个模板。
	如果使用了template_name,则会搜索template_name。
	
	get_queryset()
	用来获取数据,如果设置了queryset,则会直接返回queryset
	
	get_context_object_name()
	返回将用于包含此视图正在操作的数据列表的上下文变量名称。如果 object_list是Django对象
	的查询集并且 context_object_name未设置,则上下文名称将是组成查询model_name集的模型
	的名称,并附加'_list' 后缀。
	
	get_context_data()
	返回用于显示对象列表的上下文数据
	
	get()
	
	render_to_response()
	返回一个self.response_class实例。如果提供了任何关键字参数,它们将被传递给响应类的
	构造函数。调用get_template_names()以获取将搜索的模板名称列表,以查找现有模板。

使用示例

	from django.utils import timezone
	from django.views.generic.list import ListView
	from articles.models import Article
	
	class ArticleListView(ListView):
	    model = Article
	    paginate_by = 100  # 设置每一页显示几个
	
	    def get_context_data(self, **kwargs):
	        context = super().get_context_data(**kwargs)
	        context['now'] = timezone.now()
	        return context
	------- urls  中的设置  -------------
	from django.urls import path
	from article.views import ArticleListView
	
	urlpatterns = [
	    path('', ArticleListView.as_view(), name='article-list'),
	]

DetailView
继承自以下几个视图

	django.views.generic.detail.SingleObjectTemplateResponseMixin
	django.views.generic.base.TemplateResponseMixin
	django.views.generic.detail.BaseDetailView
	django.views.generic.detail.SingleObjectMixin
	django.views.generic.base.View

方法流程图

	setup()
	dispatch()
	http_method_not_allowed()
	get_template_names()
	get_slug_field()
	返回用于通过slug查找的slug字段的名称。默认情况下,这只返回值slug_field。
	get_queryset()
	get_object()
	get_context_object_name()
	get_context_data()
	get()
	render_to_response()

使用示例

	from django.utils import timezone
	from django.views.generic.detail import DetailView
	from articles.models import Article
	class ArticleDetailView(DetailView):

	    model = Article
	    def get_context_data(self, **kwargs):
	        context = super().get_context_data(**kwargs)
	        context['now'] = timezone.now()
	        return context
	------- urls  中的设置  -------------
	from django.urls import path
	from article.views import ArticleDetailView
	urlpatterns = [
    	path('<slug:slug>/', ArticleDetailView.as_view(), name='article-detail'),
	]
### 集成 Python Django 和 Vue 的方法 在现代 Web 应用开发中,前后端分离是一种常见的架构模式。Django 是一个强大的后端框架,而 Vue 则是一个流行的前端框架。以下是关于如何在 Python Django 中集成和使用 Vue 的详细介绍。 #### 1. 使用 RESTful API 连接 Django 和 Vue 为了使 Django 和 Vue 能够协同工作,通常会通过 RESTful API 来连接两者。这可以通过安装 `djangorestframework` 实现[^2]。RESTful API 提供了一种标准的方式来传递数据,使得前端可以轻松调用后端接口获取所需的数据。 ```bash pip install djangorestframework ``` 接着,在项目的 `settings.py` 文件中修改 `INSTALLED_APPS` 添加 `'rest_framework'`: ```python INSTALLED_APPS = [ ... 'rest_framework', ] ``` 创建视图类来处理请求: ```python from rest_framework.views import APIView from rest_framework.response import Response class ExampleAPIView(APIView): def get(self, request): data = {"message": "Hello from Django!"} return Response(data) ``` 配置 URL 路由以便访问该 API: ```python from django.urls import path from .views import ExampleAPIView urlpatterns = [ path('api/example/', ExampleAPIView.as_view(), name='example-api'), ] ``` 此时,Vue 可以通过 HTTP 请求(如 Axios 或 Fetch)与这个 API 对话。 --- #### 2. 设置静态文件服务 为了让 Vue 构建后的静态文件能够被 Django 正确加载,需调整 Django 的设置。首先确保项目中的 `STATIC_URL` 已正确定义,并将构建好的 Vue 文件放入指定目录下[^1]。 ```python # settings.py STATIC_URL = '/static/' STATICFILES_DIRS = [BASE_DIR / "frontend/dist"] # Vue 打包后的路径 ``` 运行以下命令完成 Vue 的打包过程: ```bash npm run build ``` 之后启动 Django 开发服务器即可查看效果。 --- #### 3. 单页应用 (SPA) 支持 如果计划部署单页应用程序,则需要让 Django 处理所有未定义路由并将它们重定向到 Vue SPA 的入口页面。为此可以在根级 urls.py 中添加如下代码片段[^4]: ```python from django.conf.urls import url from django.views.generic.base import TemplateView urlpatterns += [ url(r'^.*$', TemplateView.as_view(template_name="index.html")), ] ``` 此操作允许任意未知地址均返回 index.html 页面,从而交由前端路由器接管导航逻辑。 --- #### 4. 数据库交互 当涉及到数据库时,可借助 Django ORM 完成模型定义并与 MySQL 结合存储业务数据。与此同时,Vue 组件可通过上述提到的 API 接口读写这些记录内容[^3]。 例如建立简单的 BlogPost 模型用于展示文章列表: ```python from django.db import models class BlogPost(models.Model): title = models.CharField(max_length=200) content = models.TextField() def __str__(self): return self.title ``` 随后编写序列化器转换对象结构便于传输给客户端: ```python from rest_framework import serializers from .models import BlogPost class BlogPostSerializer(serializers.ModelSerializer): class Meta: model = BlogPost fields = '__all__' ``` 最后更新视图函数提供完整的 CRUD 功能支持。 --- #### 总结 综上所述,Python Django 和 Vue 的集成主要依赖于 RESTful API 设计理念,辅之恰当的静态资源配置策略以及良好的前后端分工协作机制共同达成目标。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值