【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 RedirectViewdef index(request):return render(request,'index.html')class turnTo(RedirectView):# 设置属性permanent=False  # 状态码为302url = None  # 重定向的路由地址pattern_name = 'index:index'query_string = True#重写 get_redirect_urldef get_redirect_url(self, *args, **kwargs):print("This is get_redirect_url")return super().get_redirect_url(*args, **kwargs)# 重写getdef 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 TemplateViewclass index(TemplateView):template_name = 'index.html'template_engine = Nonecontent_type = Noneextra_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.pyfrom django.views.generic import ListView
from .models import PersonInfoclass 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.pyfrom django.views.generic import DetailView
from .models import PersonInfoclass 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 %}

我们发现自定义标签的定义方式与内置标签的定义方式是相同的,两者最大的区别在于:
●自定义标签需要在项目里搭建目录环境。
●在使用时需要在模板文件里导入自定义标签文件。

模板继承

在templates文件夹里创建base.html文件,该文件作为共用模板,代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
{% block title %}<title>首页</title>
{% endblock %}
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>

在base.html的代码中看到,<title>写在模板标签{%block title %}{% endblock %}里面,而<body>里的内容改为{% block body %}{% endblock %}。block标签是为其他模板文件调用时提供内容重写的接口,body是对这个接口进行命名。在一个模板中可以添加多个block标签,只要每个block标签的命名不相同即可。接着在模板index.html中调用共用模板base.html,代码如下:

{% extends "base.html" %}
{% block body %}
<a href="{% url 'index:index' %}">首页</a>
<h1>Hello Django</h1>
{% endblock %}

●通过使用标签{% block title %}或{% block body%}来重写模板base.html的网页内容。

●如果没有使用标签block重写共用模板的内容,网页内容将就由共用模板提供。比如模板index.html没有 使用标签{% block title %}重新定义,那么网页标题内容应由模板base.html设置的<title>提供。

# index的url.py
from django.urls import path
from .views import *
urlpatterns = [# 定义路由path('', index, name='index'),
]# index的views.py
from django.shortcuts import render
def index(request):return render(request, 'index.html', locals())

在这里插入图片描述

七. 模型与数据库

# index的models.py
class PersonInfo(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=20)
age = models.IntegerField()
hireDate = models.DateField()
def __str__(self):return self.name
class Meta:verbose_name = '人员信息'

模型PersonInfo定义了4个不同类型的字段,分别代表自增主键、字符类型、整型和日期类型.

我们可以在源码里查看Field的定义过程(django\db\models\fields_init_.py)并且对模型字段的参数进行分析

模型除了定义模型字段和重写函数__str__之外,还有Meta选项,这三者是定义模型的基本要素

如果项目里有多个App,并且每个App的models.py文件里定义了模型对象,当首次执行makemigrations指令时,Django就在每个App的migrations文件夹里创建0001_initial.py文件。
0001_initial.py文件将models.py定义的模型生成数据表的脚本代码,该文件的脚本代码可被migrate指令执行,migrate指令会根据脚本代码的内容在数据库里创建相应的数据表。

在执行数据迁移之前,可以使用check指令检测整个项目,项目检测成功后再执行数据迁移操作。

python manage.py check

对模型Vocation进行实例化,再对实例化对象的属性进行赋值,从而实现数据表的数据插入:

# 方法一
# 使用create方法实现数据插入
>>> v=Vocation.objects.create(job='测试工程师',title='系统测试',
payment=0,name_id=3)
# 数据新增后,获取新增数据的主键id
>>> v.id
# 方法二
# 同样使用create方法,但数据以字典格式表示
>>> d=dict(job='测试工程师',title='系统测试',payment=0,name_id=3)
>>> v=Vocation.objects.create(**d)
# 数据新增后,获取新增数据的主键id
>>> v.id
# 方法三
# 在实例化时直接设置属性值
>>> v=Vocation(job='测试工程师',title='系统测试',payment=0,name_id=3)
>>> v.save()
# 数据新增后,获取新增数据的主键id
>>> v.id

八. 表单与模型

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue】@、@/、../和./的区别

&#xff1a;表示vue语法中v-on的简写&#xff1b;绑定事件的专用格式。当事件触发的时候&#xff0c;函数才会来调用&#xff1b; /&#xff1a;在build文件夹下webpack.base.conf.js找到&#xff0c;便能知道代表什么了; 这里指向src文件夹 . /&#xff1a;表示当前目录下&…

【代码随想录】【算法训练营】【第27天】 [39]组合总和 [40] 组合总和II [131]分割回文串

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day26&#xff0c; 休息的周末~ day 27&#xff0c;周一&#xff0c;库存没了&#xff0c;哭死~ 题目详情 [39] 组合总和 题目描述 39 组合总和 解题思路 前提&#xff1a;组合的子集问题&…

云渲染农场什么是线程模式?

许多设计师在选择云渲染农场时&#xff0c;常常会遇到48线程、56线程、72线程等选项&#xff0c;然而&#xff0c;不少新手在面对这些选择时&#xff0c;往往无法直观地感受到不同线程数量之间的差异。接下来&#xff0c;我们将共同探讨线程的作用和影响&#xff0c;帮助大家更…

「小白必读」国内超火的 8 款 AI 大模型,你的副业都来自它

大家好&#xff0c;最近好多朋友在问我&#xff0c;国内是否有好用的大模型&#xff0c;今天我就整理好 8 款大模型&#xff0c;大家可以多尝试&#xff0c;一定会有不一样的感觉。 01 HOTSPOT Kimi 网址&#xff1a;https://kimi.moonshot.cn/ Kimi 是由月之暗面科技有限公…

Anacode+YOLO识别图片

一、安装Anacoda 因为我原本是已经安装了python&#xff0c;后面直接卸载了&#xff0c;然后安装了最新版的anacoda 下载网址为&#xff1a; Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载版本是&#xff1a; 按照安装教程直接…

初出茅庐的小李博客之使用立创开发板(ESP32)连接到EMQX Platform【MQTT TLS/SSL 端口连接】

介绍 手上有一块立创开发板&#xff0c;本着不吃灰的原则把它用起来&#xff0c;今天就来用它来连接上自己部署的MQTT服务器进行数据通信。 硬件&#xff1a;立创开发板 开发环境&#xff1a;Arduino IDE Win11 MQTT 平台&#xff1a;EMQX Platform 立创开发板介绍&#xff1…

nginx和proxy_protocol协议

目录 1. 引言2. HTTP server的配置3. Stream server的配置3.1 作为proxy_protocol的前端服务器3.2 作为proxy_protocol的后端服务器1. 引言 proxy_protocol 是haproxy开发的一种用于在代理服务器和后端服务器之间传递客户端连接信息的协议。使用 proxy_protocol 的主要优势是能…

Redis中大Key与热Key的解决方案

原文地址&#xff1a;https://mp.weixin.qq.com/s/13p2VCmqC4oc85h37YoBcg 在工作中Redis已经成为必备的一款高性能的缓存数据库&#xff0c;但是在实际的使用过程中&#xff0c;我们常常会遇到两个常见的问题&#xff0c;也就是文章标题所说的大 key与热 key。 一、定义 1.1…

索尼CEO宣布全力推进AI电影制作,《蜘蛛侠》制片人坚称不用AI

原标题&#xff1a;索尼互娱制片人与CEO唱反调 易采游戏网6月3日消息&#xff1a;在最近的一次行业会议上&#xff0c;索尼影业高层首席执行官托尼文西奎拉向媒体透露&#xff0c;索尼正在全力推进人工智能(AI)技术的研发与应用&#xff0c;特别是在电影制作流程中。这一策略旨…

【Hive SQL 每日一题】统计各个商品今年销售额与去年销售额的增长率及排名变化

文章目录 测试数据需求说明需求实现分步解析 测试数据 -- 创建商品表 DROP TABLE IF EXISTS products; CREATE TABLE products (product_id INT,product_name STRING );INSERT INTO products VALUES (1, Product A), (2, Product B), (3, Product C), (4, Product D), (5, Pro…

24年西藏事业单位报名详细流程

✨各位姐妹们注意啦&#xff01;24西藏事业单位公告已出&#xff0c;本次计划公开招聘8⃣9⃣9⃣人即日起开始报名&#xff0c;想要上岸的姐妹们要抓紧了哦✊趁着还有时间赶紧开卷&#xff01;&#xff01;&#xff01; &#x1f308;24西藏事业单位招聘考试&#xff1a; &…

双向带头链表实现

目录 一. 逻辑结构图解 1. 节点中存储的值 2.逻辑实现 二. 各种功能实现 1. 创建节点函数 2. 初始化哨兵位 3. 尾插 4. 头插 5. 尾删 6. 头删 7. 打印链表值 8. 查找数据&#xff0c;返回节点地址 9. 指定地址后插入节点 10. 删除指定地址节点 11. 销毁链表 三.…

Meterpreter工具使用

Meterpreter属于stage payload&#xff0c;在Metasploit Framework中&#xff0c;Meterpreter是一种后渗透工具&#xff0c;它 属于一种在运行过程中可通过网络进行功能扩展的动态可扩展型Payload。这种工具是基于“内存DLL注 入”理念实现的&#xff0c;它能够通过创建一个新进…

碰撞检测技术在AI中的重要作用

引言&#xff1a; 随着人工智能技术的不断发展&#xff0c;AI已经渗透到我们生活的方方面面。在游戏、机器人、虚拟现实等领域中&#xff0c;碰撞检测技术扮演着至关重要的角色。本文将探讨碰撞检测技术在AI中的作用&#xff0c;以及如何利用这项技术来改善AI系统的性能和用户体…

在Unity中配置Android项目以允许HTTP流量,解决AVPro在Android平台中无法播放http视频

解决方法快速通道&#xff1a;拉到底&#xff0c;看倒数第二张图 好记性不如烂笔头 最近在使用AVpro插件播放http视频&#xff0c;在Editor中一切正常&#xff0c;然而打包在Android平台下就播放不了 AVPro在Unity中的警告&#xff1a; 感觉只是个警告&#xff0c;没引起注意…

超越Devin!姚班带队,他们创大模型编程新世界纪录

超越Devin&#xff01;SWEBench排行榜上迎来了新玩家—— StarShip CodeGen Agent&#xff0c;姚班带队初创公司OpenCSG出品&#xff0c;以23.67%的成绩获得全球第二名的成绩。 同时创造了非GPT-4o基模的最高纪录&#xff08;SOTA&#xff09;。 我们都知道&#xff0c;SWEBe…

人脸识别技术与人证合一智能闸机的剖析

人脸识别技术&#xff0c;作为一种先进的生物认证手段&#xff0c;依据个体面部独有的特征信息来进行身份验证。这项技术通过捕获图像或视频中的面部数据&#xff0c;执行一系列精密步骤&#xff0c;包括图像获取、面部定位、预处理、特征提取与比对&#xff0c;以确认个人身份…

FL Studio怎么给钢琴加延音 FL Studio怎么用钢琴做伴奏

在使用钢琴音色进行音乐创作的时候&#xff0c;可以对钢琴进行延音处理&#xff0c;这样处理的音色给人的感觉会更加的饱满丰富&#xff0c;同时&#xff0c;给钢琴加了延音之后&#xff0c;钢琴的声音时值也会相应的变长&#xff0c;听起来更加的柔和。今天就和大家讲一讲&…

DVWA靶场搭建:Apache、MySQL、PHP、DVWA

最近为了能够较为真实地学习Web渗透的各种技术&#xff0c;就想着自己搭建一个专门用于学习的Web演练平台--DVWA“靶场”。 DVWA可以进行暴力&#xff08;破解&#xff09;、命令行注入、跨站请求伪造、文件包含、文件上传、不安全的验证码、SQL注入、SQL盲注、弱会话ID、XSS漏…

深度学习知识与心得

目录 深度学习简介 传统机器学习 深度学习发展 感知机 前馈神经网络 前馈神经网络&#xff08;BP网络&#xff09; 深度学习框架讲解 深度学习框架 TensorFlow 一个简单的线性函数拟合过程 卷积神经网络CNN&#xff08;计算机视觉&#xff09; 自然语言处理NLP Wo…