1、View
提供基于不同 http 方法执行不同逻辑的功能
2、TemplateView
基于 view 之上,针对 get 方法提供了渲染特定模板的功能
# 源码分析
class TemplateView(TemplateResponseMixin, ContextMixin, View):
TemplateResponseMixin --> 提供了找到模板名,渲染模板的能力
ContextMixin --> 提供了获取上下文的能力
views.py
from django.shortcuts import render
from django.views import View
from django.views.generic import TemplateView
class haha(View):
pass
class TemplateTest(TemplateView):
template_name = 'the_11/templateView.html'
def get_context_data(self, **kwargs):
context = super().get_context_data()
context['lan'] = 'python-django'
return context
urls.py
from django.urls import path
from .views import haha, TemplateTest
urlpatterns = [
path('haha/', haha.as_view()),
path('TemplateTest/', TemplateTest.as_view()),
]
templatevie.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>templateview</title>
</head>
<body>
<h1>这是templateview页面</h1>
{{ lan }}
</body>
</html>
3、RedirectView
基于 view 之上提供重定向的功能
permanent —— 是否永久重定向
# 永久重定向 —— 301
HttpResponsePermanentRedirect(url)
# 临时重定向 —— 302
HttpResponseRedirect(url)
url
指定 url 直接跳转
class RedirectTest(RedirectView):
url = '/the_9/index'
pattern_name —— url 中 name 的参数
指定名字,也可以直接跳转
from django.urls import path
from .views import index
urlpatterns = [
path('index/', index, name='Yang')
]
class RedirectTest(RedirectView):
# url = '/the_9/index'
pattern_name = 'Yang'
4、ListView
▶ 提供了什么功能
以列表的形式展示数据的功能
▶ 数据从哪里来
数据从数据库中查询得来的
model
quertyset
get_queryset
▶ 提供了哪些模板变量
object_list
自定义: context_object_name
something_list
▶ 渲染的模板页
默认
子应用名/模型名的小写_list.html
# the_12的 ListViews类 使用的是the_10的模型
# 请问: 模版渲染 渲染的是the_12模版 还是the_10的模版?
自定义: template_name
5、Mixins —— 混入
6、DetailView
▶ 提供了什么功能
提供的单个变量渲染到模版的功能
▶ 数据从哪里来
数据从什么地方获取到
model
queryset
get_queryset
怎么带着数据去查询的
get_object
queryset = queryset.filter(pk=pk)
▶ 提供了哪些模板变量
object
模型名小心 (something) ??? 有空测试一下
context_object_name
▶ 渲染的模板页
模型所在的子应用/模型名的小写_detail.html
template_name
view.py
from django.views import View
from django.views.generic import TemplateView, RedirectView, DetailView
from the_10.models import Something
class DetailViewTest(DetailView):
model = Something
something_detail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>something_detail</title>
</head>
<body>
<h1>something_detail 的页面</h1>
{{ object.msg }}
</body>
</html>