【Django】从零开始学Django【2】

五. CBV视图

Django植入了视图类这一功能,该功能封装了视图开发常用的代码,无须编写大量代码即可快速完成数据视图的开发,这种以类的形式实现响应与请求处理称为CBV(Class Base Views)。
在这里插入图片描述

1. 数据显示视图

数据显示视图是将后台的数据展示在网页上,数据主要来自模型,一共定义了4个视图类,分别是RedirectView、TemplateView、ListView和DetailView

●RedirectView用于实现HTTP重定向,默认情况下只定义GET请求的处理方法。
●TemplateView是视图类的基础视图,可将数据传递给HTML模板,默认情况下只定义GET请求的处理方法。
●ListView是在TemplateView的基础上将数据以列表显示,通常将某个数据表的数据以列表表示。
●DetailView是在TemplateView的基础上将数据详细显示,通常获取数据表的单条数据。

重定向视图 RedirectView

视图类RedirectView用于实现HTTP重定向功能,即网页跳转功能

下面代码演示:

定义路由的时候,若使用视图类turnTo处理HTTP请求,则需要对视图类turnTo使用as_view()方法,这是对视图类turnTo进行实例化处理

# index的urls.py
from django.urls import path
from .views import *
urlpatterns = [
    # 定义首页的路由
    path('', index, name='index'),
    path('turnTo', turnTo.as_view(), name='turnTo'),
]
# index的views.py
from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse,Http404
from django.views.generic.base import RedirectView

def index(request):
    return render(request,'index.html')

class turnTo(RedirectView):
    # 设置属性
    permanent=False  # 状态码为302
    url = None  # 重定向的路由地址
    pattern_name = 'index:index'
    query_string = True

    #重写 get_redirect_url
    def get_redirect_url(self, *args, **kwargs):
        print("This is get_redirect_url")
        return super().get_redirect_url(*args, **kwargs)

    # 重写get
    def get(self,request,*args,**kwargs):
        print(request.META.get('HTTP_USER_AGENT'))
        return super().get(request,*args,**kwargs)
<!DOCTYPE html>
<html>
<body>
<h3>Hello RedirectView</h3>
<a href="{% url 'index:turnTo' %}?k=1">Toturn</a>

</body>
</html>

在这里插入图片描述

在这里插入图片描述

基础视图 TemplateView

代码如下:

# index的views.py
from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse,Http404
from django.views.generic.base import TemplateView

class index(TemplateView):
    template_name = 'index.html'
    template_engine = None
    content_type = None
    extra_context = {'title': 'This is GET'}

    # 重新定义模板上下文的获取方式
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['value'] = 'I am MyDjango'
        return context

    # 定义HTTP 的POST请求的处理方法
    # 参数 request 代表 HTTP 请求信息
    def post(self,request,*args,**kwargs):
        self.extra_context = {'title':'This is POST'}
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)

get_context_data()方法用于获取模板上下文内容,模板上下文是将视图里的数据传递到模板文件,再由模板引擎将数据转换成HTML网页数据。

自定义POST请求的处理方法,当触发POST请求时,将会重设属性extra_context的值,并调用get_context_data()将属性extra_context重新写入,从而实现动态改变模板上下文的数据内容

●extra_context:为模板文件的上下文(模板变量)设置变量值,可将数据转换成网页数据展示在浏览器上。
●get_context_data():继承并重写视图类TemplateView的类方法,在变量context里新增数据value。

# index的urls.py
from django.urls import path
from .views import *
urlpatterns = [
    # 定义首页的路由
    path('', index.as_view(), name='index'),

]
<!DOCTYPE html>
<html>
<body>
<h3>Hello,{{ title }}</h3>
<div>{{ value }}</div>
<br>

<form action="" method="post">
    {% csrf_token %}
    <input type="submit" value="Submit">
</form>

</body>
</html>

在这里插入图片描述
在这里插入图片描述

列表视图ListView

ListView,该视图类是将数据表的数据以列表的形式显示,常用于数据的查询和展示。

由于视图类ListView需要使用模型对象,因此在MyDjango项目里定义PersonInfo模型,在index的models.py中编写以下代码:

# index的models.py
from django.db import models
class PersonInfo(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=20)
    age = models.IntegerField()

在数据库里生成相应的数据表:

首先在Pycharm里面连接数据库:
这里以SQL Server为例子:
SQLServer配置教程

数据库连接比较麻烦:

django连接sqlserver:

pip install mssql-django==1.2
pip install pyodbc django-pyodbc-azure

还要配置setting.py:
红色部分自己修改:
在这里插入图片描述

在终端输入:

# 根据models.py生成相关的.py文件,该文件用于创建数据表
python manage.py makemigrations

# 创建数据表
python manage.py migrate

在这里插入图片描述
然后打开数据库,记得刷新!!!

在这里插入图片描述
成功!!!

然后编辑index_personinfo:
在这里插入图片描述

当指令执行完成后,Django会默认创建多个数据表,其中数据表index_personinfo对应index的models.py中所定义的PersonInfo类,其余的数据表都是Django内置的功能所生成的,主要用于Admin站点、用户认证和Session会话等功能。

代码如下:

# index的views.py

from django.views.generic import ListView
from .models import PersonInfo

class index(ListView):
    # 设置模板文件
    template_name = 'index.html'
    # 设置模板外的数据
    extra_context = {'title':'人员信息表'}
    # 查询模型
    queryset = PersonInfo.objects.all()
    # 每页展示一条数据
    paginate_by = 1
    # 若不设置,则上下文默认为personinfo_list
    # context_object_name = 'personinfo'
<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
<h3>{{ title }}</h3>
<table border="1">
    {% for i in personinfo_list %}
        <tr>
            <th>{{ i.name }}</th>
            <th>{{ i.age }}</th>
        </tr>
    {% endfor %}
</table>
<br>
{% if is_paginated %}
<div class="pagination">
<span class="page-links">
    {% if page_obj.has_previous %}
        <a href="/?page={{ page_obj.previous_page_number }}">上一页</a>
    {% endif %}
    {% if page_obj.has_next %}
        <a href="/?page={{ page_obj.next_page_number }}">下一页</a>
    {% endif %}
<br>
<br>
<span class="page-current">
    第{{ page_obj.number }}页,
    共{{ page_obj.paginator.num_pages }}页。
</span>

</span>

</div>

{% endif %}
</body>
</html>

在这里插入图片描述

详细视图DetailView

视图类DetailView的属性pk_url_kwarg和slug_url_kwarg用于确定模型的查询条件;属性slug_field用于确定模型的查询字段;属性query_pk_and_slug用于确定模型主键和其他字段的组合查询。

沿用之前的models,编写以下代码:

# index的urls.py
from django.urls import path
from .views import *
urlpatterns = [
    # 定义首页的路由
    path('<pk>/<age>.html', index.as_view(), name='index'),

]
# index的views.py

from django.views.generic import DetailView
from .models import PersonInfo

class index(DetailView):
    # 设置模板文件
    template_name = 'index.html'
    # 设置模板外的数据
    extra_context = {'title':'人员信息表'}
    # 设置模型的查询字段
    slug_field = 'age'
    # 设置路由的变量名,与属性slug_field 实现模型的查询功能
    slug_url_kwarg = 'age'
    pk_url_kwarg = 'pk'
    # 设置查询模型
    model = PersonInfo
    # 属性queryset 可以做简单的查询操作
    queryset = PersonInfo.objects.all()
    # 若不设置则模板上下文默认为'personinfo'
    # context_object_name = 'personinfo'
    # 是否将pk和slug作为查询条件
    query_pk_and_slug = True  #属性query_pk_and_slug用于确定模型主键和其他字段的组合查询
<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
<h3>{{ title }}</h3>
<table border="1">
  
        <tr>
            <th>{{ personinfo.name }}</th>
            <th>{{ personinfo.age }}</th>
        </tr>
</table>
<br>

</body>
</html>

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2. 数据操作视图

数据操作视图有4个视图类,分别是FormView、CreateView、UpdateView和DeleteView

●FormView视图类使用内置的表单功能,通过表单实现数据验证、响应输出等功能,用于显示表单数据。
●CreateView实现模型的数据新增功能,通过内置的表单功能实现数据新增。
●UpdateView实现模型的数据修改功能,通过内置的表单功能实现数据修改。
●DeleteView实现模型的数据删除功能,通过内置的表单功能实现数据删除。

3. 日期筛选视图

日期筛选视图是根据模型里的某个日期字段进行数据筛选,然后将符合结果的数据以一定的形式显示在网页上。简单来说,就是在列表视图ListView或详细视图DetailView的基础上增加日期筛选所实现的视图类。

六. 模板

1. Django模板引擎

Django内置的模板引擎包含模板上下文(亦可称为模板变量)、标签和过滤器

模板上下文

{{ variable }}表示,variable是上下文的名称,它支持Python所有的数据类型,如字典、列表、元组、字符串、整型或实例化对象等

例如:

# 假如variable1 = '字符串或整型'
<div>{{ variable1 }}</div>
# 输出“<div>字符串或整型</div>”
# 假如variable2={'name': '字典或实例化对象'}
<div>{{ variable2.name }}</div>
# 输出“<div>字典或实例化对象</div>”
# 假如variable3 = ['元组或列表']
<div>{{ variable3.0 }}</div>
# 输出“<div>元组或列表</div>

如果视图没有为模板上下文传递数据或者模板上下文的某个属性、索引下标不存在,Django就会将其设为空值

自定义标签

标签是对模板上下文进行控制输出,它是以{% tag%}表示的,其中tag是标签的名称,Django内置了许多模板标签,比如{% if %}(判断标签){% for %}(循环标签){% url %}(路由标签)

例如:

# for标签,支持嵌套,myList可为列表、元组或某个对象
# item可自定义命名,代表当前循环的数据对象
# {% endfor %}是循环区域终止符,代表这区域的代码由标签for输出
{% for item in myList %}
{{ item }}
{% endfor %}
# if标签,支持嵌套
# 判断条件符与上下文之间使用空格隔开,否则程序会抛出异常
# {% endif %}与{% endfor %}的作用是相同的
{% if name == "Lily" %}
{{ name }}
{% elif name == "Lucy" %}
{{ name }}
{% else %}
{{ name }}
{% endif %}
# url标签
# 生成不带变量的URL地址
<a href="{% url 'index' %}">首页</a>
# 生成带变量的URL地址
<a href="{% url 'page' 1 %}">1</a>
# with标签,与Python的with语法的功能相同
# total=number无须空格隔开,否则抛出异常
{% with total=number %}
{{ total }}
{% endwith %}
# load标签,导入静态文件标签库staticfiles
# staticfiles来自settings.py的INSTALLED_APPS
{% load staticfiles %}
# static标签,来自静态文件标签库staticfiles
{% static "css/index.css" %}

在这里插入图片描述
for标签的模板说明:
在这里插入图片描述

{% for name in name_list %}
{% if forloop.counter == 1 %}
<span>这是第一次循环</span>
{% elif forloop.last %}
<span>这是最后一次循环</span>
{% else %}
<span>本次循环次数为:{{forloop.counter }}</span>
{% endif %}
{% endfor %}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[链表]求中间节点、反转链表、回文链表

一、求链表的中间节点 876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 快慢指针法: 分别定义两个节点的指针(pSlow和pFast)指向链表的第一个节点&#xff0c;然后两个指针一起往后遍历链表&#xff0c;pFast一次移动两个节点&#xff0c;pSlow一次移动一个节点&…

基于Java的高校学生勤工助学优派系统的设计与实现(论文+源码)_kaic

摘 要 高校勤工助学管理系统的出现&#xff0c;让学生的工作更加标准,不仅仅使高校办公室的办公水平以及管理水平大大提高&#xff0c;还优化了勤工助学资金的使用方式方法&#xff0c;完善了资助所需费用的资源配置&#xff0c;可以卓有成效地缩减学校的管理经费。本系统主…

EPSON RX8111CE+松下高性能电池的组合应用

RTC是一种实时时钟&#xff0c;用于记录和跟踪时间&#xff0c;具有独立供电和时钟功能。在某些应用场景中&#xff0c;为了保证RTC在断电或者其他异常情况下依然能够正常工作&#xff0c;需要备份电池方案来提供稳定的供电。本文将介绍EPSON爱普生nA级RTC RX8111CE松下Panason…

Android 生成正式版密钥库 KeyStore

步骤1&#xff1a;打开生成正式版密钥库设置 点击 Build 菜单&#xff0c;选择 Generate Signed App Bundle or APK&#xff1a; 这是打开后的样子&#xff1a; 步骤2&#xff1a;选择 APK Android App Bundle 是用于上架 Google Play 商店的。 正常情况下选择 APK。 选择…

JVM学习-javap解析Class文件

解析字节码的作用 通过反编译生成字节码文件&#xff0c;可以深入了解Java工作机制&#xff0c;但自己分析类文件结构太麻烦&#xff0c;除了第三方的jclasslib工具外&#xff0c;官方提供了javapjavap是jdk自带的反解析工具&#xff0c;它的作用是根据class字节码文件&#x…

C语言实现Hash Map(3):Map代码优化

在上一节中&#xff0c;我们学习了C语言实现Hash Map(2)&#xff1a;Map代码实现详解&#xff0c;通过代码&#xff0c;我们更深入地了解了Map实现的原理&#xff0c;学习了如何通过key找到对应的桶并加入节点。也正如上一节提到的&#xff0c;虽然这是github中star比较多的代码…

You don‘t have enough free space或者no space left on device异常

1.磁盘空间不足 Linux安装软件显示 You dont have enough free space 或者docker拉镜像时&#xff0c;出现磁盘空间不足的情况 no space left on device 如果你是ubuntu系统。查看磁盘空间 df -h 多半是这个目录满了/dev/mapper/ubuntu--vg-ubuntu--lv 大多情况我们只希望扩…

Android 14 - 绘制体系 - VSync(1)

整体框架 VsyncConfiguration&#xff1a;一些基本参数的配置类&#xff0c;比如PhaseOffsets、WorkDuration等。 Scheduler&#xff1a;作为SF生成和派发VSync的整体调度器&#xff0c;主要面向SurfaceFlinger提供VSync相关接口。Scheduler包含对所有屏幕的VSync的控制。本身是…

影响所有股票、债券和ETF交易!一文看懂美国“T+1”结算新规

T1对投资者有何好处&#xff1f;有哪些风险&#xff1f;T1已经到来&#xff0c;T0还远吗&#xff1f; 美股将在本周迎来历史性时刻。 从当地时间5月28日开始&#xff0c;美股交易结算周期将由T2缩短至T1&#xff0c;即投资者当天卖出的股票&#xff0c;在交易后一个工作日就能…

[Python]pyenv 环境配置

。pip install pyenv安装 / 去Git 下载pyenv版本安装 。安装好后控制台输入pyenv查看版本 。pyenv install --list列出所有pyenv可以支持的python版本 。pyenv install 3.9.7 安装指定的版本 。在pycharm里&#xff0c;可以选中项目&#xff0c;点击File-Settings&#xff0…

如何评价 OpenAI 最新发布支持实时语音对话的模型GPT-4o?OpenAI发完GTP-4o,国内大模型行业还有哪些机会?

文章目录 OpenAI发完GTP-4o&#xff0c;国内大模型行业还有哪些机会&#xff1f;详细了解一下OpenAI最新发布的支持实时语音对话的模型GPT-4o国内大模型如何寻找发展机会&#xff1f;想要发展技术必须要创新与追赶或许应用场景拓展也是一种出路产业生态构建 ChatGPT 问世才 17 …

大字体学生出勤记录系统网页源码

源码介绍 上课需要一个个点名记录出勤情况&#xff0c;就借助AI制作了一个网页版学生出勤记录系统&#xff0c; 大字体显示学生姓名和照片&#xff0c;让坐在最后排学生也能看清楚&#xff0c;显示姓名同时会语音播报姓名&#xff0c; 操作很简单&#xff0c;先导入学生姓名…

制作ARM架构 docker镜像

docker简介 docker客户端 Docker 客户端有两种替代选项:名为 docker 的命令行应用程序或名为 Docker Desktop 的基于图形用户界面 (GUI) 的应用程序。 CLI 和 Docker Desktop 均与 Docker 服务器交互。 来自 CLI 或 Docker Desktop 的 docker 命令使用 Docker REST API 将指…

C++ | Leetcode C++题解之第116题填充每个节点的下一个右侧节点指针

题目&#xff1a; 题解&#xff1a; class Solution { public:Node* connect(Node* root) {if (root nullptr) {return root;}// 从根节点开始Node* leftmost root;while (leftmost->left ! nullptr) {// 遍历这一层节点组织成的链表&#xff0c;为下一层的节点更新 next…

Android LAME原生音频

前言 我想大家都做过录音的功能吧&#xff0c;首先想到的是不是MediaRecorder&#xff1f;今天我们不用MediaRecorder&#xff0c;而是使用LAME库自己编译音频编码模块&#xff0c;很明显&#xff0c;这个需要用到NDK。凡是涉及到音视频编解码这块的&#xff0c;都需要用到And…

STM32H750外设之ADC通道选择

目录 概述 1 通道选择功能介绍 2 通道选择&#xff08; SQRx、 JSQRx&#xff09; 2.1 通道复用 2.1.1 通道介绍 2.1.2 通道框图 2.2 转换分组 2.3 内部专用通道 3 通道预选寄存器 (ADCx_PCSEL) 3.1 功能介绍 3.2 预选通道寄存器 概述 本位主要介绍STM32H750外设之…

2024年03月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 在Python中,hex(2023)的功能是?( ) A:将十进制数2023转化成十六进制数 B:将十进制数2023转化成八进制数 C:将十六进制数2023转化成十进制数 D:将八进制数2023转化成十进制数 答案:A …

迭代器模式(行为型)

目录 一、前言 二、迭代器模式 三、总结 一、前言 迭代器模式(Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;提供一种方法顺序访问一个聚合对象中各个元素&#xff0c;而又不暴露该对象的内部表示。总的来说就是分离了集合对象的遍历行为&#xff0c;抽象出…

深度学习环境安装教程-anaconda-python-pytorch

首先是anaconda的安装&#xff0c;可以从下面地址下载安装包 Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 尽量选择最新的日期的anaconda进行安装&#xff0c;我这里是windows电脑&#xff0c;因此选择了windos-x86_64.exe&#xf…

TIM(Timer)简介

TIM&#xff08;Timer&#xff09;定时器介绍 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时不仅具备基本的定时中断功能&#xff0c;而且…