Django 9 常用通用视图分析

news2024/9/28 3:26:56

View

提供基于不同http方法执行不同逻辑的功能。

1. 创建 terminal输入 django-admin startapp the_13回车 

2.tutorial子文件夹 settings.py注册一下

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "the_3",
    "the_5",
    "the_6",
    "the_7",
    "the_8",
    "the_9",
    "the_10",
    "the_12",
    "the_13",
]

3. tutorial子文件夹 urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('the_3/', include('the_3.urls')),
    path('the_4/', include('the_4.urls')),
    path('the_5/', include('the_5.urls')),
    path('the_7/', include('the_7.urls')),
    path('the_10/', include('the_10.urls')),
    path('the_12/', include('the_12.urls')),
    path('the_13/', include('the_13.urls')),
]

4. the_13\views.py 

from django.shortcuts import render
from django.views import View


# Create your views here.

class Hello(View):
    pass

ctrl + 鼠标左键 点击 View可以看源码里面的View方法 。

as_view方法里面重写了view方法,这个view方法返回dispatch功能,通过dispatch功能的分发方法,然后去method方法中看到对应的方法有get,post等方法,views.py 里面的hello就可以执行对应的get或者post方法

TemplateView

基于View之上针对get方法提供了渲染特定模板的功能。

1. the_13\views.py 添加 class TemplateTest(TemplateView):

2. ctrl + 鼠标左键点击TemplateView

class TemplateView(TemplateResponseMixin, ContextMixin, View):
    """
    Render a template. Pass keyword arguments from the URLconf to the context.
    """
    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)

可以看到 TemplateView 继承了 TemplateResponseMixin, ContextMixin, View。

class TemplateResponseMixin:
    """A mixin that can be used to render a template."""
    template_name = None
    template_engine = None
    response_class = TemplateResponse
    content_type = None

3. templates文件夹创建子文件夹 the_13, 再在新建的the_13文件夹创建panda.html, panda.html的代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>panda</title>
</head>
<body>
    <h1>这是TemplateView的页面</h1>
</body>
</html>

4.  the_13\views.py 

from django.shortcuts import render
from django.views import View
from django.views.generic import TemplateView


# Create your views here.

class Hello(View):
    pass

class TemplateTest(TemplateView):
    template_name = 'the_13/panda.html'
TemplateResponseMixin ---> 提供了找到模板名然后渲染模板的能力
class ContextMixin:
    """
    A default context mixin that passes the keyword arguments received by
    get_context_data() as the template context.
    """
    extra_context = None

    def get_context_data(self, **kwargs):
        kwargs.setdefault('view', self)
        if self.extra_context is not None:
            kwargs.update(self.extra_context)
        return kwargs
ContextMixin ---> 帮我们获取上下文的能力

5. the_13\views.py

from django.shortcuts import render
from django.views import View
from django.views.generic import TemplateView


# Create your views here.

class Hello(View):
    pass

class TemplateTest(TemplateView):
    template_name = 'the_13/panda.html'

    def get_context_data(self, **kwargs):
        context = super(TemplateTest,self).get_context_data()
        context['lan'] = 'python-django'
        return context

6. the_13\urls.py

from django.urls import path
from .views import TemplateTest

urlpatterns = [
    path('template_test/', TemplateTest.as_view()),
]

7. 运行tutorial, 点击http://127.0.0.1:8000/, 浏览器地址栏 panda, 刷新浏览器 

8. templates\the_13\panda.html body 里面添加 {{ lan }}

<body>
    <h1>这是TemplateView的页面</h1>
    {{ lan }}
</body>

9. 刷新浏览器 

TemplateView总结 

  • 提供了什么功能: 在view的基础上,针对get方法, 渲染指定模板的功能
  • 数据从哪里来: 没数据 ----  get_context_data
  • 提供了哪些模板变量  没提供
  • 渲染的模板页   template_name 自定义

RedirectView

基于View之上, 提供了重定向的功能

  • permanent
  • url
  • pattern_name

1. the_13\views.py 

from django.shortcuts import render
from django.views import View
from django.views.generic import TemplateView, RedirectView


# Create your views here.

class Hello(View):
    pass

class TemplateTest(TemplateView):
    template_name = 'the_13/panda.html'

    def get_context_data(self, **kwargs):
        context = super(TemplateTest,self).get_context_data()
        context['lan'] = 'python-django'
        return context

    # def post(self):
    #     pass

"""
render(request,'模板', {"lan":"python-django"})
"""

class RedirectTest(RedirectView):
    url = '/the_10/index/'

2. the_13\urls.py 

from django.urls import path
from .views import TemplateTest,RedirectTest

urlpatterns = [
    path('template_test/', TemplateTest.as_view()),
    path('redirect_test/', RedirectTest.as_view()),
]

3. 运行tutorial, 点击 http://127.0.0.1:8000/,

浏览器地址栏 http://127.0.0.1:8000/the_13/redirect_test/ 刷新 

4. pattern_name, 在 the_10\urls.py 

from django.urls import path
from .views import index

urlpatterns = [
    path('index/', index, name='hua'),
]

5. the_13\views.py 

class RedirectTest(RedirectView):
    # url = '/the_10/index/'
    pattern_name = 'hua'

6. 运行 tutorial, 点击http://127.0.0.1:8000/ , 浏览器地址栏 http://127.0.0.1:8000/the_13/redirect_test/ 刷新

源码分析 :

permanent = False   是否永久重定向
url = None
pattern_name = None   url中name参数
query_string = False

RedirectView总结 

  • 提供了什么功能: 基于View之上提供重定向的功能
  • 数据从哪里来: url pattern_name
  • 提供了哪些模板变量  没提供
  • 渲染的模板页   没渲染

通用视图分析法

  • 提供了什么功能
  • 数据从哪里来
  • 提供了哪些模板变量
  • 渲染的模板页

ListView

提供以(分页)列表形式展示一个(或多个关联)数据库表的功能

  • queryset、model、get_queryset
  • paginate_by、page
  • context_object_name
  • template_name
提供了什么功能
    以列表的形式展示数据的功能
数据从哪里来
    数据从数据库中查询得来的
    model
    queryset
    get_queryset
提供了哪些模板变量
    object_list
    自定义 : context_object_name
    something_list
渲染的模板页
    默认
    子应用名/模型名的小写_list.html
      the_12的ListViews类使用的是the_10的模型
      请问模板渲染 渲染的是the_12的模板还是the_10的模板
       回答: the_10的, 模型在哪里,渲染的应用就在哪里

    自定义:template_name

Mixins

从ListView入手分析混入 

混入可以继承多个,但是View只能继承一个

DetailView

  • template_name_suffix
  • object 

1. the_13\views.py 

from django.shortcuts import render
from the_12.models import SomeThing
from django.views import View
from django.views.generic import TemplateView, RedirectView, ListView, DetailView


# Create your views here.

class Hello(View):
    pass

class TemplateTest(TemplateView):
    template_name = 'the_13/panda.html'

    def get_context_data(self, **kwargs):
        context = super(TemplateTest,self).get_context_data()
        context['lan'] = 'python-django'
        return context

    # def post(self):
    #     pass

"""
render(request,'模板', {"lan":"python-django"})
"""

class RedirectTest(RedirectView):
    # url = '/the_10/index/'
    pattern_name = 'hua'

class DetailViewTest(DetailView):
    model = SomeThing

2. the_13\urls.py 

from django.urls import path
from .views import TemplateTest,RedirectTest,DetailViewTest

urlpatterns = [
    path('template_test/', TemplateTest.as_view()),
    path('redirect_test/', RedirectTest.as_view()),
    path('detail_test/<int:pk>', DetailViewTest.as_view()),
]

3. templates\the_13文件夹创建 something_detail.html 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
    <h1>hello world</h1>
</body>
</html>

4. 运行tutorial, 点击 http://127.0.0.1:8000/, 浏览器地址栏 

ImproperlyConfigured at /the_13/detail_test/1 刷新 

5. 把 something_detail.html 移动到 templates\the_12文件夹,再刷新浏览器 

6. something_detail.html  body 里面 添加 msg 是 {{ object.msg }}

<body>
    <h1>hello world</h1>
    msg 是 {{ object.msg }}
</body>

7. 刷新浏览器 

8. something_detail.html  body 里面 去掉 msg 是

<body>
    <h1>hello world</h1>
    {{ object.msg }}
</body>

9. 刷新浏览器 

10. 把地址栏最后的数字,改成2,或者 3 刷新, 会得到第二条msg, 或者第三条msg

DetailView总结 

  • 提供了什么功能: 提供了单个变量渲染到模板的功能
  • 数据从哪里来:  

                数据从什么地方获取到

                model
                queryset
                get_queryset

                怎么带着数据去查询的            

                get_object
                queryset = queryset.filter(pk=pk)
  • 提供了哪些模板变量   

                object

                模型名小写(something) ???  可以测试一下

                context_object_name

  • 渲染的模板页   

                模型所在的子应用/模型名的小写_detail.html

                template_name 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1363950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

九州金榜|孩子步入叛逆期,常常离家出走怎么办?

孩子在拥有了独立意识后&#xff0c;就开始试图挑战父母的权威。他们会主动去质疑父母&#xff0c;主动去证明自己的成熟和独立&#xff0c;还会主动试图逃离父母的控制范围。 近日就收到了家长求助孩子离家出走问题的私信&#xff0c;在得到家长同意&#xff0c;接下来我们就…

Docker-Compose部署Redis(v7.2)分片集群(含主从)

文章目录 一、前提准备1. 文件夹结构 二、配置文件1. redis.conf2. docker-compose文件 三、构建集群1. 自动分配主从关系2.1 构建3 master集群2.2 手动配置从节点 四、测试1. 集群结构2. 分片测试 环境 docker desktop for windows 4.23.0redis 7.2 目标 搭建如下图分片主从…

利用ArcGIS探究环境与生态因子对水体、土壤、大气污染物等影响的实践技术

如何利用ArcGIS实现电子地图可视化表达&#xff1f;如何利用ArcGIS分析空间数据&#xff1f;如何利用ArcGIS提升SCI论文的层次&#xff1f;制图是地理数据展现的直观形式&#xff0c;也是地理数据应用的必要基础。本次课程从ArcGIS的基本操作、ArcGIS 的空间数据分析及ArcGIS 的…

算法基础之货仓选址

货仓选址 核心思想&#xff1a; 贪心 绝对值不等式 : ∣ x – a ∣ ∣ x – b ∣ ≥ ∣ a – b ∣ |x – a| |x – b| ≥ |a – b| ∣x–a∣∣x–b∣≥∣a–b∣ 将n个数两两分组 1~~ n-1 (奇数会剩一个) 分别用绝对值不等式 即可推出来 货仓位置应该在中位数上(奇数) 或在中…

鸿蒙应用开发 闹钟实现

后台代理提醒简介 随着生活节奏的加快&#xff0c;我们有时会忘记一些重要的事情或日子&#xff0c;所以提醒功能必不可少。应用可能需要在指定的时刻&#xff0c;向用户发送一些业务提醒通知。例如购物类应用&#xff0c;希望在指定时间点提醒用户有优惠活动。为满足此类业务…

C# Unity将地形(Terrain)导出成obj文件

C# Unity将地形(Terrain)导出成obj文件 从其他地方搬运过来的&#xff0c;只能到出obj模型&#xff0c;不能导出贴图 using System.IO; using System.Text; using UnityEditor; using UnityEngine; using System;enum SaveFormat { Triangles, Quads } enum SaveResolution {…

Landsat8的辐射定标与大气校正

目录 打开影像辐射定标大气校正计算区域高程计算研究区高程大气校正查看处理结果 打开影像 在文件夹中找到xxx_MTL.txt文件&#xff0c;拖到ENVI中 此处可能会出现无法打开的问题&#xff0c;参考该文章&#xff08;ENVI无法打开Landsat8的头文件问题和解决&#xff09; 辐…

Iceberg从入门到精通系列之十九:分区

Iceberg从入门到精通系列之十九&#xff1a;分区 一、认识分区二、Iceberg的分区三、Hive 中的分区四、Hive 分区问题五、Iceberg的隐藏分区六、分区变换七、分区变换 一、认识分区 分区是一种通过在写入时将相似的行分组在一起来加快查询速度的方法。 例如&#xff0c;从日志…

C#,冒泡排序算法(Bubble Sort)的源代码与数据可视化

排序算法是编程的基础。 常见的四种排序算法是&#xff1a;简单选择排序、冒泡排序、插入排序和快速排序。其中的快速排序的优势明显&#xff0c;一般使用递归方式实现&#xff0c;但遇到数据量大的情况则无法适用。实际工程中一般使用“非递归”方式实现。本文搜集发布四种算法…

【WPF】使用 WriteableBitmap 提升 Image 性能

【WPF】使用 WriteableBitmap 提升 Image 性能 前言WriteableBitmap 背景WriteableBitmap 渲染原理WriteableBitmap 使用技巧案例核心源码测试结果 前言 由于中所周不知的原因&#xff0c;WPF 中想要快速的更新图像的显示速率一直以来都是一大难题。在本文中&#xff0c;我将分…

leetcode“位运算”——只出现一次的数字

只出现一次的数字i&#xff1a; https://leetcode.cn/problems/single-number/ 给你一个非空整数数组 nums&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现一次的元素。 class Solution { public:int singleNumber(vector<i…

九州金榜|孩子厌学,作为父母有想做自己的原因吗?

孩子不会天生就厌学&#xff0c;如果孩子天生厌学&#xff0c;那么孩子就不可能学会说话&#xff0c;走路&#xff0c;日常生活&#xff0c;更不可能去上学&#xff0c;孩子厌学因素非常多&#xff0c;而作为父母&#xff0c;你有没有想过是你的原因造成的呢&#xff1f;九州金…

【深度学习:Domain Adversarial Neural Networks (DANN) 】领域对抗神经网络简介

【深度学习&#xff1a;Domain Adversarial Neural Networks】领域对抗神经网络简介 前言领域对抗神经网络DANN 模型架构DANN 训练流程DANN示例 GPT示例 前言 领域适应&#xff08;DA&#xff09;指的是当不同数据集的输入分布发生变化&#xff08;这种变化通常被称为共变量变…

Redis概览

Redis存储是Key-Value结构的数据&#xff0c;其中Key是字符串类型&#xff0c;Value有5种常见的数据类型 字符串 String 哈希 hash 列表 list 集合 set 有序集合 sorted set / zset 各种数据类型的特性 字符串操作命令 : ● SET ke…

解决Vue3 中Echarts数据更新渲染不上问题

解决办法就是让Dom节点重新渲染 定义一个变量 const postLoading ref(true); 请求数据前dom节点不渲染&#xff0c;获取完数据重新渲染

2024年1月阿里云服务器租用价格表_优惠活动大全

2024年1月最新阿里云服务器租用价格表&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;2核4G4M带宽轻量服务器一年165元12个月、2核4G服务器30元3个月&#xff0c;云服务器ECS可以选择经济型e实例、通用…

静态网页设计——中医中药网(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a;https://www.bilibili.com/video/BV11e411i7g8/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.com…

三种主流流协议的浏览器播放解决方案

三种主流流协议的浏览器播放解决方案 流协议介绍 主流的流协议&#xff08;streaming protocol&#xff09;包括HLS、RTMP、RTSP&#xff0c;下面依次介绍下三种视频流。 HLS HLS&#xff08;Http Live Streaming) 是一个由苹果公司提出的基于HTTP的流媒体网络传输协议&…

LeetCode-重复的子字符串(459)

题目描述&#xff1a; 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 思路一&#xff1a; 使用枚举的方法。首先因为字符串s有一个子串重复多次构成&#xff0c;那么s的长度len与子串的长度subLen应该成倍数关系&#xff0c;并且在s中索…

C语言 B树的分析与实现

本文主要说明了B树的概念、应用以及如何用C语言实现B树。 概述 有使用过数据库的朋友都知道&#xff0c;数据库需要存储大量的数据&#xff0c;并且查询数据的性能也需要一定的保证。那么数据库的底层数据结构是如何实现的呢&#xff0c;就是我们要讨论的B树和B树&#xff0c…