【Django使用】10大章31模块md文档,第5篇:Django模板和数据库使用

news2024/9/25 23:18:27

当你考虑开发现代化、高效且可扩展的网站和Web应用时,Django是一个强大的选择。Django是一个流行的开源Python Web框架,它提供了一个坚实的基础,帮助开发者快速构建功能丰富且高度定制的Web应用

全套Django笔记直接地址: 请移步这里


共 10 章,31 子模块


模板

模板使用

1. 配置模板目录

如果命令行创建的项目,需要手动配置模板文件目录,如果是Pycharm创建的项目,则无需配置

  1. 在项目根目录下创建模板目录,比如叫 templates,后续开发模板文件会放在此目录下
  2. 在项目的配置文件settings.py文件中,进行模板目录的配置,如下:

django-004

2. 定义模板文件

templates目录中新建一个模板文件,如index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!-- 显示模板变量 -->
    <h1>{{ name }}</h1>

</body>
</html>

3. 模板渲染

方式一: 通过render函数

from django.shortcuts import render

def index(request):
    context = {'name': 'django' }
    # 参数1:请求对象
    # 参数2:模块路径
    # 参数3:字典数据
    return render(request, 'index.html', context)

方式二: 通过Template对象的render方法

from django.template import loader

def index(request):
    # 模板对象
    template = loader.get_template('index.html')  # type: Template
    # 渲染得到字符串
    html_str = template.render(context)
    # 响应请求
    return HttpResponse(html_str)

模板语法

  1. 模板变量
  2. 模板语句
  3. 过滤器
  4. 注释
  5. 模板继承

1. 模板变量

变量名必须由字母、数字、下划线(不能以下划线开头)和点组成,语法如下:

{{ 变量 }}

模板变量可以使python的内建类型,也可以是对象。

def index(request):
    context = {
        'name': 'django',
        'my_list': ['python', 'java', 'php', 'c/c++'],
        'my_dict': {
            'name': 'python',
            'age': 20,
            'gender': '男',
        }
    }
    return render(request, 'index.html', context)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>{{ name }}</h1>
    <h1>{{ my_list }}</h1>  
    <h1>{{ my_list.0 }}</h1>   <!-- 注意列表的取值方法 -->
    <h1>{{ my_dict }}</h1>
    <h1>{{ my_dict.name }}</h1>  <!-- 注意字典的取值方法 -->
</body>
</html>

2. 模板语句

1)for循环:

{% for item in 列表 %}
    {{forloop.counter}}  <1-- 表示当前是第几次循环,从1开始 -->
    {{forloop.counter0}}  <!-- 表示当前是第几次循环,从0开始 -->
{% empty %} 
    列表为空或不存在时执行此逻辑
{% endfor %}

2)if条件:

{% if ... %}
    逻辑1
{% elif ... %}
    逻辑2
{% else %}
    逻辑3
{% endif %}

比较运算符如下:

==
!=
<
>
<=
>=

布尔运算符如下:

and
or
not

注意:运算符左右两侧必须有空格。

{% if a == 1 %}  # 正确
{% if a==1 %}  # 错误

3. 过滤器

语法如下:

  • 使用管道符号|来应用过滤器,用于进行计算、转换操作,可以使用在变量、标签中。
  • 如果过滤器需要参数,则使用冒号:传递参数。
变量|过滤器:参数

列举几个如下:

  • safe,禁用html转义(显示html标签样式,而不是字符串)
  • length,长度,返回字符串包含字符的个数,或列表、元组、字典的元素个数。
  • default,默认值,如果变量不存在时则返回默认值。
data|default:'默认值'
  • date,日期,用于对日期类型的值进行字符串格式化,常用的格式化字符如下:

    • Y表示年,格式为4位,y表示两位的年。
    • m表示月,格式为01,02,12等。
    • d表示日, 格式为01,02等。
    • j表示日,格式为1,2等。
    • H表示时,24进制,h表示12进制的时。
    • i表示分,为0-59。
    • s表示秒,为0-59。
value|date:"Y年m月j日  H时i分s秒"

4. 注释

1)单行注释语法如下:

{#...#}

2)多行注释使用comment标签,语法如下:

{% comment %}
...
{% endcomment %}

5. 模板继承

  • 模板继承和类的继承含义是一样的
  • 可以使用模板继承来复用父模板,提高代码的复用性,减轻开发人员的工作量。
  • 可以通过定义 block ,实现子模板对父模块内容的重写

父模板

如果发现在多个模板中某些内容相同,那就可以使用block标签把这段内容定义到父模板中。

{% block 块名称 %}
    预留区域,可以编写默认内容,也可以没有默认内容
{% endblock %}

子模板

  1. 使用extends标签继承父模板,写在子模板文件的第一行。
{% extends "父模板路径" %}
  1. 对有需要的block进行重写:

    • 不用重写父模版中的所有block,如果子模版没有重写,则使用父模版定义的默认值。
    • 可以使用 block.super 来包含父模板的块中定义的内容,如下
    {% block 名称 %}
          子模板的内容
          {{ block.super }}    显示父模板中block的内容
      {% endblock %}
    

数据库

学习目标

  • 能够进行Django数据库配置
  • 掌握Django中模型类的定义
  • 掌握Django中的迁移命令的使用
  • 能够使用Django的ORM进行数据库的增删改查
  • 能够说明查询集QuerySet的特点
  • 能够说明模型类管理器Manager的作用

数据库

ORM框架

  • ORM Object relational mapping 对象关系映射
  • 把类和数据库表对应,把对象和表记录对应,通过类和对象操作数据库表中的数据,而不需要编写SQL语句

ORM

  • Django框架实现了ORM 功能:

    • 不需要直接面向数据库编程,通过模型类和对象完成数据表的增删改查操作
    • 自动生成数据库表
    • 通过配置切换使用不同的数据库
  • ORM 开发步骤

    1. 配置数据库

    2. 定义模型类 (models.py)

    3. 执行迁移命令,生成数据库表

      1. 生成迁移文件: python manage.py makemigrations
      2. 生成数据库表: python manage.py migrate
      3. 默认数据库为 sqlite3,数据库名为:db.sqlite3
    4. 通过模型类和对象操作数据库

数据库配置和迁移

  • Django项目默认 sqlite3 数据库, 生成的数据库名为 db.sqlite3
  • sqlite3 仅供测试使用,可以通过配置修改为使用 mysql

一、配置使用MySQL数据库

  1. 手动创建 MySQL 数据库,比如叫: db_django01
create database db_django01 charset=utf8;
  1. 在与项目 setting.py 文件中配置使用mysql
DATABASES = {
     'default': {
         # 配置使用mysql
         'ENGINE': 'django.db.backends.mysql',     # 数据库产品
         'HOST': "localhost",           # 数据库ip
         'PORT': 3306,                  # 数据库端口
         'USER': "root",                # 用户名
         'PASSWORD': "mysql",           # 密码
         'NAME': "db_django01",         # 数据库名
     }
 }
  1. 在python虚拟环境下安装 MySQL 驱动
pip install pymysql
  1. 与项目同名的包 下的 __init__.py 文件中,初始化MySQL驱动
import pymysql
 pymysql.install_as_MySQLdb()

二、迁移命令生成表

打开终端,进入到项目根目录下,执行以下2个命令,生成数据库表

1. 生成迁移文件

python manage.py makemigrations

2. 生成数据库表

python manage.py migrate

3. 查看数据库表

image

一、需求

定义模型类,保存部门-员工数据

  • 部门类(Department)

    • 部门名称: name
    • 部门成立时间: create_date
    • 逻辑删除标识:is_delete
  • 员工类(Employee)

    • 性名: name
    • 年龄: age
    • 性别: sex
    • 工资: salary
    • 入职时间: hire_date
    • 备注信息: comment

二、模型类定义

  • 模型类被定义在 应用/models.py 文件中
  • 模型类必须继承自 Djangomodels.Model
1. 属性定义
  • 模型类属性与表字段一一对应

  • 定义属性时,需要指定字段类型,通过字段类型的参数指定选项,格式如下:

    • 属性名 = models.字段类型(字段选项)
  • 属性名不能是python的保留关键字

  • 属性名不能使用连续的下划线(这是由django的查询方式决定的)

2. 关于主键
  • 主键:primary key,简写 pk
  • 不需要主动定义,django会自动生成自增长的主键,属性名叫 id,
  • 如果开发者自己定义了主键,则django不会再生成默认的主键
3. 表名
  • 默认为:应用名小写_模型类名小写
  • 可通过通过Meta类指定表名,例如
  
  
# 如果应用名为users,则默认表名为:users_department
  
  
  class Department(models.Model):
      ...
      class Meta:
          # 指定生成的数据库表的名字
          db_table = 'department'
4. 字段类型

官方文档:字段类型和选项

类型说明
AutoField自动增长的IntegerField,通常不用指定,不指定时Django会自动创建名为id的自动增长属性
BooleanField布尔字段,值为True或False
NullBooleanField支持Null、True、False三种值
CharField字符串,必须指定max_length,表示最大字符个数
TextField大文本字段,一般超过4000个字符时使用
IntegerField整数
DecimalField十进制浮点数,用python中的Decimal实例来表示必须指定max_digits总位数,decimal_places小数位数。
FloatField浮点数
DateField日期1) 参数auto_now表示每次修改保存对象时,自动设置该字段为当前时间,用于保存"最后一次修改"时间,默认为False;2) 参数auto_now_add表示当对象第一次被创建时自动设置保存当前时间,用于保存"创建时间"时间,默认为值为False;3) 参数auto_now_addauto_now是相互排斥的,不能同时用到一个属性中
TimeField时间,参数同DateField
DateTimeField日期时间,参数同DateField
FileField上传文件字段
ImageField继承于FileField,对上传的内容进行校验,确保是有效的图片
4. 字段选项
选项默认值描述是否要迁移修改表结构
nullFalseTrue表示表字段允许为空
uniqueFalseTrue表示表字段不能重复
db_column属性名称表字段名称
primary_keyFalseTrue表示字段设置为了主键,一般作为AutoField的选项使用
default-默认值
blankFalse在django管理后台新增或编辑一条表数据时,该字段是否允许为空;null是数据库范畴的概念,blank是表单验证范畴的
choices-在django管理后台新增或编辑一条表数据时,该字段显示为下拉框,默认为编辑框
  • choices: 性别属性使用了choices选项后,在录入一条数据时,会以下拉框显示
  • blank:blank属性默认值为false, 表示录入一条数据时,当前字段必须填写,不能为空,否则js端js校验不通过,例如:下图的comment员工备注信息字段。

image

5. 外键

关系型数据库的关系包括三种类型

  • ForeignKey: 一对多,将 关联属性 定义在多的一端中
  • ManyToManyField: 多对多,将 关联属性 定义任意一方中
  • OneToOneField: 一对一,将 关联属性 定义在任意一方中


二、代码参考

部门和员工模型类 代码参考

class Department(models.Model):
    """部门类"""

    # 部门名称:字符串类型(必须要指定最大长度)
    name = models.CharField(max_length=20)
    # 部门成立时间: 日期类型
    create_date = models.DateField(auto_now_add=True)
    # 逻辑删除标识:标识部门是否删除
    is_delete = models.BooleanField(default=False)

    def __str__(self):
        return self.name

    class Meta: 
        # 指定表名
        db_table = 'department'

class Employee(models.Model):
    """员工类"""

    choices_gender = (
        (0, '男'),
        (1, '女'),
    )

    name = models.CharField(max_length=20)
    age = models.IntegerField()
    gender = models.IntegerField(default=0, choices=choices_gender)
    # 工资:浮点类型(必须要指定两个选项)  999999.99
    salary = models.DecimalField(max_digits=8, decimal_places=2)
    # 备注信息: 可以为空
    comment = models.CharField(max_length=300, null=True, blank=True)
    # 员工入职时间
    hire_date = models.DateField(auto_now_add=True)
    # 一对多的外键:员工所属部门 department_id
    department = models.ForeignKey('Department')

    def __str__(self):
        return self.name

    class Meta: 
        # 指定表名
        db_table = 'employee'

交互环境

Django交互环境

  • 在Django交互环境中,可以直接执行django项目代码,类似 ipython 交互环境
  • 有以下两种方式使用Django交互环境

1. 通过 shell 命令进入Django交互环境

python manage.py shell

image

2. 使用 PyCharmpython Console 窗口

image

未完待续 下一期下一章

全套笔记直接地址: 请移步这里

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

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

相关文章

camera-caps:Jetson设备上的一种实用的V4L2可视化界面

camera-caps&#xff1a;Jetson设备上的一种实用的V4L2可视化界面 github地址是&#xff1a; https://github.com/jetsonhacks/camera-caps 注意&#xff1a;Jetpack5.x需要选择tag 5.x版本

【基础知识】AB软件RSLinx的版本说明

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 之前对AB的软件了解比较少&#xff0c;在工作中未接触过&#xff0c;最近一次现场勘察时&#xff0c;有很多中控系统都是AB的&#xff0c;借此机会对AB软件有了些许了解。 一、RSLinx是什么软件&#xff1f; RSLinx是…

【LeetCode刷题-回溯】-- 46.全排列

46.全排列 方法&#xff1a;回溯法 一种通过探索所有可能的候选解来找出所有的解的算法&#xff0c;如果候选解被确认不是一个解&#xff0c;回溯法会通过在上一步进行一些变化抛弃该解&#xff0c;即回溯并且再次尝试 使用一个标记数组表示已经填过的数 class Solution {pu…

vue3自定义拖拽指令

<template><div v-move class"box"></div> </template><script setup lang"ts"> import { Directive } from vue const vMove:Directive (el:HTMLElement) >{const mousedown (e:MouseEvent) >{// 鼠标按下const s…

『 C++类与对象 』多态之单继承与多继承的虚函数表

文章目录 &#x1fae7; 前言&#x1fae7; 查看虚表&#x1fae7; 单继承下的虚函数表&#x1fae7; 多继承下的虚函数表 &#x1fae7; 前言 多态是一种基于继承关系的语法,既然涉及到继承,而继承的方式有多种: 单继承多继承棱形继承棱形虚拟继承 不同的继承方式其虚表的形…

redis运维(十八)pipeline

一 pipeline 流水线 说明&#xff1a; 这里讲解的不是jenkins的pipeline流水线这里pipeline: 管道 redis为什么要提供pipeline功能 事务和pipeline ① pipeline的理念 强调&#xff1a;单纯的pipeline跟事务没有关系redis-cli --pipe --> 使用了pipeline机制说明&a…

【Skynet 入门实战练习】游戏模块划分 | 基础功能模块 | timer 定时器模块 | logger 日志服务模块

文章目录 游戏模块基础功能模块定时器模块日志模块通用模块 游戏模块 游戏从逻辑方面可以分为下面几个模块&#xff1a; 注册和登录网络协议数据库玩法逻辑其他通用模块 除了逻辑划分&#xff0c;还有几个重要的工具类模块&#xff1a; Excel 配置导表工具GM 指令测试机器人…

CAD图纸设计在线协同、CAD图纸设计在线协同方案?

CAD图纸设计在线协同、CAD图纸设计在线协同方案&#xff1f; CAD图纸设计在线协同&#xff0c;在企业产品研发效能的提升中发挥着重要作用&#xff0c;技术应用的深入发展为不同场景的协作带来了全新的应用模式&#xff0c;工业设计领域亦是如此。 在CAD图纸设计与管理过程中&a…

RabbitMQ 搭建和工作模式

MQ基本概念 1. MQ概述 MQ全称 Message Queue&#xff08;[kjuː]&#xff09;&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。 &#xff08;队列是一种容器&#xff0c;用于存放数据的都是容器&#xff0…

【分布式】小白看Ring算法 - 03

相关系列 【分布式】NCCL部署与测试 - 01 【分布式】入门级NCCL多机并行实践 - 02 【分布式】小白看Ring算法 - 03 【分布式】大模型分布式训练入门与实践 - 04 概述 NCCL&#xff08;NVIDIA Collective Communications Library&#xff09;是由NVIDIA开发的一种用于多GPU间…

SQL进阶学习

1.[NISACTF 2022]join-us sql报错注入和联合注入 过滤&#xff1a; as IF rand() LEFT by updatesubstring handler union floor benchmark COLUMN UPDATE & sys.schema_auto_increment_columns && 11 database case AND right CAST FLOOR left updatexml DATABA…

CLion安装与配置教程

目录 一、下载并安装CLion1、下载1、官网&#xff1a;2、注意&#xff1a; 2、安装1、下载完成后&#xff0c;直接点击安装包安装&#xff0c;即可。2、开始安装&#xff0c;然后下一步3、可以在此处自定义地址&#xff0c;然后下一步4、根据系统版本选择&#xff0c;然后下一步…

Linux:虚拟机安装Ubuntu系统

一、下载Ubuntu 地址&#xff1a;https://cn.ubuntu.com/download/desktop 二、安装 以上配置完成后&#xff0c;点击完成按钮&#xff0c;接下来就是一段较长时间的等待安装过程。 安装完成后&#xff0c;还有一些系统性配置。 系统配置非常简单&#xff0c;全部next即可。…

开源 GPU池化软件 | (AI人工智能训练平台、AI人工智能推理平台)

GPU池化软件 | (AI人工智能训练平台、AI人工智能推理平台) 讨论群v:&#x1f680;18601938676 一、AI人工智能开发-------------面临的问题和挑战 1. GPU管理难题 1.1 资源管理难&#xff1a;算力资源昂贵&#xff0c;但是缺乏有效管理&#xff0c;闲置情况严重。 1.2 用户…

【uniapp】uniapp开发小程序定制uni-collapse(折叠面板)

需求 最近在做小程序&#xff0c;有一个类似折叠面板的ui控件&#xff0c;效果大概是这样 代码 因为项目使用的是uniapp&#xff0c;所以打算去找uniapp的扩展组件&#xff0c;果然给我找到了这个叫uni-collapse的组件&#xff08;链接&#xff1a;uni-collapse&#xff09…

Django 入门学习总结4

视图是Django应用程序在Python语言中提供特定的方法并对应于有特定的模板的网页。网页的页面通过视图的方式进行跳转。 在投票系统中&#xff0c;有四个视图&#xff1a; 首页视图&#xff0c;显示最新的问题列表。细节视图&#xff0c;显示问题文本&#xff0c;通过表单可以…

【标注数据】labelme的安装与使用

这里写目录标题 下载标数据 下载 标数据 打开自动保存 创建矩形

FreeRTOS的并行与并发思考

FreeRTOS的任务触发是由滴答时钟触发SysTick中断来触发调度器执行或阻塞或挂起和切换任务的。 首先是任务的并发能力&#xff0c;FreeRTOS的任务执行是基于全抢占调度机制&#xff0c;任务优先级按在就绪列表中由高到低排布&#xff0c;系统首先执行最高优先级任务&#xff0c;…

【element优化经验】怎么让element-ui中表单多语言切换排版不乱

目录 前言&#xff1a; 痛点&#xff1a; 1.左对齐&#xff0c;右对齐在中文和外语情况下字数不同&#xff0c;固定宽度会使名称换行&#xff0c;不在整行对齐&#xff0c;影响美观。 2.如果名称和输入框不在一行&#xff0c;会使页面越来越长 3.label-width值给变量&#…

Switch的使用及其注意事项

注意第五点要看清&#xff0c;case执行完后匹配没有成功&#xff0c;如过有Default&#xff0c;将会执行Default&#xff0c;如果有case在Default之后&#xff0c;而且Default没有break语句&#xff0c;那么将会继续执行case的语句&#xff0c;此时case中的常量表达式只起语句标…