02.案列项目Demo

news2024/11/22 17:17:51

1.创建项目

1. 创建项目

用pycharm 选择对应的编译器,输入对应的文件名,点击创建项目。删除默认外层生成的template和DIRS 配置项:

在这里插入图片描述

2. 创建App

创建appo1的命令:

python manage.py startapp app01

如果使用pycharm>tool>manage.py task:

manage.py@day16 > startapp app01

在这里插入图片描述

生成APP之后,在setting的INSTALLED_APP中注册:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config'
]

3.用Django的方式创建表结构

进入app01>model.py中,写表结构:

from django.db import models


class Department(models.Model):
    """部门表"""
    id = models.BigAutoField(verbose_name='id,自增', primary_key=True)  # bigint类型
    # id = models.AutoField(verbose_name='id,自增',primary_key=True)#int类型
    title = models.CharField(verbose_name='标题', max_length=32)


class UserInfo(models.Model):
    """员工表"""
    name = models.CharField(verbose_name="姓名", max_length=16)
    password = models.CharField(verbose_name="密码", max_length=64)
    age = models.IntegerField(verbose_name='年龄')
    account = models.DecimalField(verbose_name='账户余额', max_length=10, decimal_places=2, default=0)
    creat_time = models.DateTimeField(verbose_name='入职时间')
    # 无约束
    depart_id = models.BigIntegerField(verbose_name='部门ID')
    # 1.有约束
    # - to:表示与哪张表关联
    # - to_field:与这张表的哪一列关联
    # 2.django:自动加
    # - 写的depart,但实际数据库字段为depart_id
    # 3.如果部门表被删除
    #  - 3.1级联删除
    depart = models.ForeignKey(to='Department', to_field='id', on_delete=models.CASCADE)
    #  - 3.2 置空
    depart = models.ForeignKey(to='Department', to_field='id', blank=True, null=True ,on_delete=models.SET_NULL)

在这里插入图片描述

4.生成数据库的表

  1. 登录数据库:mysql -u root -p

格式:mysql [-h 主机名] -u 用户名 -p密码 [-P端口号] [-D数据库名]

参数选项:

[-h主机名或ip地址]或者[–host=主机名ip地址]:指定登录的主机名;

[-u用户名]或者[–user=用户名]:指定用户登录的用户名;

[-p密码(p小写)]或者[–password=密码]:输入登录密码;

[-P端口号(P大写)]或者[–port=端口号]:指定登录的MySQL的端口号;

[-D数据库名]或者[–database=数据库名]:指定登录的数据库名称;

登录本地数据库,只需要指定用户名(-u)和密码(-p)即可,不需要指定主机名(-h)

  1. 创建数据库:

create database day16 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

查看所有数据库:

show databases;

  1. 在Djangoh中修改配置文件,连接数据库

在setting.py中修改数据库配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',  # 数据库名字
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',  # 要连接哪台机器上的MySQL
        'PORT': '3306'  # 端口号
    }
}
  1. 通过Django命令去生成数据库表,或者通过tools>run manage.py task

python manage.py makemigrations

python manage.py migrate

查看生成的表:

use 数据名;
show tables;
desc app01_department;

  1. 创建静态文件(static>css/js/img/plugins)和模板文件templates

5.部门管理

目前只是体验,用最原始的方法做的

Django中提供Form和ModelForm组件,非常方便。

5.1 部分列表

from django.db import models


class Department(models.Model):
    """部门表"""
    id = models.BigAutoField(verbose_name='id,自增', primary_key=True)  # bigint类型
    # id = models.AutoField(verbose_name='id,自增',primary_key=True)#int类型
    title = models.CharField(verbose_name='标题', max_length=32)


class UserInfo(models.Model):
    """员工表"""
    name = models.CharField(verbose_name="姓名", max_length=16)
    password = models.CharField(verbose_name="密码", max_length=64)
    age = models.IntegerField(verbose_name='年龄')
    account = models.DecimalField(verbose_name='账户余额', max_digits=10, decimal_places=2, default=0)
    creat_time = models.DateTimeField(verbose_name='入职时间')

    # 无约束
    # depart_id = models.BigIntegerField(verbose_name='部门ID')
    # 1.有约束
    # - to:表示与哪张表关联
    # - to_field:与这张表的哪一列关联
    # 2.django:自动加
    # - 写的depart,但实际数据库字段为depart_id
    # 3.如果部门表被删除 
    #  - 3.1级联删除
    depart = models.ForeignKey(to='Department', to_field='id', on_delete=models.CASCADE)
    #  - 3.2 置空
    depart = models.ForeignKey(to='Department', to_field='id', blank=True, null=True, on_delete=models.SET_NULL)

    # 4.Django中做的约束:
    gender_choices = (
        (0, '女'),
        (1, '女')
    )
    gender = models.SmallIntegerField(verbose_name='性别,男1,女0', choices=gender_choices)

2.模板的继承

通过将共用的部分做成一个模板,然后在不同的位置插入插槽,最终通过继承共用部分,重写差异化部分,达到代码复用。

在复用的代码部分,加入插槽,文件命名为layout.html:

<div class="content">
    {% block css %}{% endblock %}
    {% block content %}{% endblock %}
</div>

继承共有部分,然后重写差异化部分:

%{% extends 'layout.html' %}

{% block content%}
    <h1>首页</h1>
{% endblock %}

3.用户管理

7.1新建用户

  • 原始方法实现思路(较本质,但麻烦):
    • 用户提交的数据,校验比较麻烦
    • 如果出现字段不合法,应该有字段不合法提示
    • 页面渲染,每一个字段都需要重写一遍
    • 对于关联表,还要自己去表查询后渲染
  • Django组件实现:
    • Form组件(中等简便):只能解决前三点,最后一个关联表查询还需要自己写
    • ModelForm组价(最简便):针对数据库中的某个表建议使用ModelForm

7.2Dangjo的Form组件

views.py中:

class Myform(Form): #Dajango中的Form
    user = forms.CharField(widget = forms.Input)
    pwd = forms.CharField(widget = forms.Input)
    emaill = forms.EmailField(widget = forms.Input)

def user_add(request):
    """添加用户(原始方式)"""
    if request.method == "GET":
        form = Myform()
        return render(request, 'user_add.html', {'form':form})

在user_add.html中

<form class="form-horizontal" method="post">
    {{form.user}}
    {{form.pwd}}
    {{form.email}}
    
    <!-->
	自动生成HTML标签,代替下面的:
    <input type="text" class="form-control" name="name" placeholder="请输入部门名称">
	 <!-->

</form>

还能更简洁的方式:

<form class="form-horizontal" method="post">
    {% for  field in form%}
    	{# 会循环将form中的字段转换成HTMl渲染在页面上 #}
    	{{field}}
    {% endfor %}
</form>

7.3 Dangjo的ModelForm组件()

1.model.py中

class UserInfo(models.Model):
    """员工表"""
    name = models.CharField(verbose_name="姓名", max_length=16)
    password = models.CharField(verbose_name="密码", max_length=64)
    age = models.IntegerField(verbose_name='年龄')
    account = models.DecimalField(verbose_name='账户余额', max_digits=10, decimal_places=2, default=0)
    creat_time = models.DateTimeField(verbose_name='入职时间')
    depart = models.ForeignKey(to='Department', to_field='id', on_delete=models.CASCADE)
    depart = models.ForeignKey(to='Department', to_field='id', blank=True, null=True, on_delete=models.SET_NULL)
    gender_choices = (
        (0, '女'),
        (1, '男')
    )
    gender = models.SmallIntegerField(verbose_name='性别,男1,女0', choices=gender_choices)

2.views.py中

class Myform(ModelForm):
	#支持自定义字段 
	xx = form.CharField('...')
    class Meta:
    	model = UserInfo
    	fields = ['name','password','age','creat_time','depart','gender','xx']

def user_add(request):
    """添加用户(原始方式)"""
    if request.method == "GET":
        form = Myform()
        return render(request, 'user_add.html', {'form':form})

3.user_add.html中

<form class="form-horizontal" method="post">
    {% for  field in form%}
    	{# 会循环将form中的字段转换成HTMl渲染在页面上 #}
    	{{field}}
    {% endfor %}
</form>

7.4 编辑用户

from django import forms


class UserModelForm(forms.ModelForm):
    name = forms.CharField(min_length=3, max_length=16, label='姓名')

    # password = forms.CharField(label='密码', validators=re.compile(r'\d+'))
    class Meta:
        model = models.UserInfo
        fields = ['name', 'password', 'age', 'account', 'creat_time', 'gender', 'depart']
        # 这种方式太麻烦了
        # widgets = {
        #     'name': forms.TextInput(attrs={'class': 'form-control'}),
        #     'age': forms.PasswordInput(attrs={'class': 'form-control'}),
        #     'account': forms.TextInput(attrs={'class': 'form-control'}),
        #     'creat_time': forms.TextInput(attrs={'class': 'form-control'}),
        #     'gender': forms.TextInput(attrs={'class': 'form-control'}),
        #     'depart': forms.TextInput(attrs={'class': 'form-control'}),
        # }

    # 简写:重写初始化方法,找到对应的插件,为其加上属性
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # 循环找到所有插件, 为其加入class= 'form-control'
        for name, field in self.fields.items():
            print(name, field)
            field.widget.attrs = {'class': 'form-control', 'placeholder': f"请输入{field.label}"}


def user_add_bymodelform(request):
    """添加用户 by ModelForm"""
    if request.method == "GET":
        form = UserModelForm()
        return render(request, 'user_add_bymodelform.html', {'form': form})
    # POST提交数据,数据校验,存入数据库
    form = UserModelForm(data=request.POST)
    if form.is_valid():
        print(form.cleaned_data)
        # 如果数据合法,保存到数据库
        form.save()
    # 校验失败,返回错误信息
    print(form.errors)
    return render(request, 'user_add_bymodelform.html', {'form': form})

def user_edit(request, id):
    """编辑用户"""
    row_object = models.UserInfo.objects.filter(id=id).first()
    if request.method == "GET":
        # 根据id获取要更新的记录
        form = UserModelForm(instance=row_object)
        return render(request, 'user_edit.html', {'form': form})
    # POST
    form = UserModelForm(data=request.POST, instance=row_object)
    if form.is_valid():
        # data=request.POST默认保存的是用用户输入的值,如果还需要加入一些字段值,可以
        # form.instance.字段名 = 新值
        form.save()
        return redirect('/user/list')
    return render(request, 'user_edit.html', {'form': form})


def user_delete(request, id):
    models.UserInfo.objects.filter(id=id).delete()
    return redirect('/user/list')

7.5 模糊搜索

# 之前的搜索
models.PrettyNumber.objects.filter(id=XX,number=XXX)

dict_data = {'id'XX, "number":XXX}
models.PrettyNumber.objects.filter(**dict_data)

Django中的对于数字的模糊搜索:

models.PrettyNumber.objects.filter(id=XX) # id=12
models.PrettyNumber.objects.filter(id__gt=XX) # id大于12
models.PrettyNumber.objects.filter(id__gte=XX) # id大于等于12
models.PrettyNumber.objects.filter(id__lt=XX) # id小于12
models.PrettyNumber.objects.filter(id__lte=XX) # id小于等于12

Django中的对于字符串的模糊搜索:

models.PrettyNumber.objects.filter(number="139") #字符串number筛选出完全等于139
models.PrettyNumber.objects.filter(number__startswith="139") #字符串number筛选出以139开头
models.PrettyNumber.objects.filter(number__endswith="155") #字符串number筛选出以155结尾
models.PrettyNumber.objects.filter(number__contains="999") #字符串number筛选出包含999
models.PrettyNumber.objects.filter(number__startswith="139") #字符串number筛选出以139开头
# 当然,也可以使用字典形式
data_dict = {"number__contains":"999"}
models.PrettyNumber.objects.filter(**data_dict) #字符串number筛选出包含999

7.6 分页

models.PrettyNumber.objects.all()[:10] # 取到前10
models.PrettyNumber.objects.filter(number__contains ="999")[5:10]

# 数据库的总条数
counts = models.PrettyNumber.objects.all().count()
# 获取price=XXX 的数据条数
counts = models.PrettyNumber.objects.filter(price=XXX).count()

使用字典形式
data_dict = {“number__contains”:“999”}
models.PrettyNumber.objects.filter(**data_dict) #字符串number筛选出包含999

7.6 分页

models.PrettyNumber.objects.all()[:10] # 取到前10
models.PrettyNumber.objects.filter(number__contains ="999")[5:10]

# 数据库的总条数
counts = models.PrettyNumber.objects.all().count()
# 获取price=XXX 的数据条数
counts = models.PrettyNumber.objects.filter(price=XXX).count()

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

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

相关文章

Qt项目报错:Cannot run compiler ‘clang++‘. /bin/sh: 1: clang++: not found

在一台旧电脑上装了深度系统&#xff0c;装了Qt&#xff0c;导入项目&#xff0c; build提示 clang找不到&#xff1a; Project ERROR: Cannot run compiler clang. Output: /bin/sh: 1: clang: not found Maybe you forgot to setup the environment? Error while parsing …

​8th参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.

​&#xff18;th参考文献&#xff1a;&#xff3b;&#xff18;&#xff3d;许少辉&#xff0e;乡村振兴战略下传统村落文化旅游设计&#xff3b;&#xff2d;&#xff3d;北京&#xff1a;中国建筑工业出版社&#xff0c;&#xff12;&#xff10;&#xff12;&#xff12;&a…

2022数学建模国赛C题官网展示论文C155论文复现

2022数学建模国赛C题C155论文复现 1.内容比对2.第一问第二小问复现代码2.1 页表合并2.2 数据的正态性检验2.2.1数据的正态性检验效果图 2.3不满足正态性&#xff0c;进行中心化对数比变换2.3.1 核心步骤-inf用0值替换2.3.2中心化对数比变换效果图 2.4描述性统计2.5 箱线图绘制 …

回归预测 | MATLAB实现TSO-LSSVM金枪鱼群算法优化最小二乘支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现TSO-LSSVM金枪鱼群算法优化最小二乘支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现TSO-LSSVM金枪鱼群算法优化最小二乘支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&a…

五种网络IO模型

五种模型出自&#xff1a;RFC标准。可参考&#xff1a; 《UNIX网络编程-卷一》 6.2 很多程序员是从高级语言的网络编程/文件操作了解到nio&#xff0c;继而了解到五种io模型的&#xff1b; 这五种io模型不止用于网络io “阻塞与****系统调用”是怎么回事&#xff1f;我知道了线…

Redis之持久化机制

文章目录 一、redis持久化二、持久化方式2.1. RDB方式2.1.1 RDB手动2.1.2 RDB自动2.1.3RDB优缺点 2.2AOF方式2.2.1 AOF写数据遇到的问题2.2.2 AOF重写方式 二、RDB和AOF优缺点对比总结 一、redis持久化 Redis 是内存数据库&#xff0c;如果不将内存中的数据库状态保存到磁盘&a…

Azure防火墙

文章目录 什么是Azure防火墙如何部署和配置创建虚拟网络创建虚拟机创建防火墙创建路由表&#xff0c;关联子网、路由配置防火墙策略配置应用程序规则配置网络规则配置 DNAT 规则 更改 Srv-Work 网络接口的主要和辅助 DNS 地址测试防火墙 什么是Azure防火墙 Azure防火墙是一种用…

ELK日志监控系统搭建docker版

目录 日志来源elk介绍elasticsearch介绍logstash介绍kibana介绍 部署elasticsearch拉取镜像&#xff1a;docker pull elasticsearch:7.17.9修改配置⽂件&#xff1a;/usr/share/elasticsearch/config/elasticsearch.yml启动容器设置密码&#xff08;123456&#xff09;忘记密码…

Redis从基础到进阶篇(一)

目录 一、了解NoSql 1.1 什么是Nosql 1.2 为什么要使用NoSql 1.3 NoSql数据库的优势 1.4 常见的NoSql产品 1.5 各产品的区别 二、Redis介绍 2.1什么是Redis 2.2 Redis优势 2.3 Redis应用场景 2.4 Redis下载 三、Linux下安装Redis 3.1 环境准备 3.2 Redis的…

Win11右键显示更多选项

不需要重启电脑&#xff0c;重启资源管理器即可&#xff0c;用命令&#xff1a;taskkill /f /im explorer.exe & start explorer.exe

一、Kafka概述

目录 1.3 Kafka的基础架构 1.3 Kafka的基础架构 Producer&#xff1a;消息生产者&#xff0c;就是向 Kafka broker 发消息的客户端Consumer&#xff1a;消息消费者&#xff0c;向 Kafka broker 取消息的客户端。Consumer Group&#xff08;CG&#xff09;&#xff1a;消费者组&…

浅析深浅拷贝

我们在对对象进行复制时就用到深浅拷贝。 一、普通复制 <script>const people{name:tim,age:22}const testpeople;console.log(test);//tim 22test.age20;console.log(test);//tim 20console.log(people);//tim 20 </script> 控制台打印结果&#xff1a; 之所以…

使用struct解析通达信本地Lday日线数据

★★★★★博文原创不易&#xff0c;我的博文不需要打赏&#xff0c;也不需要知识付费&#xff0c;可以白嫖学习编程小技巧&#xff0c;喜欢的老铁可以多多帮忙点赞&#xff0c;小红牛在此表示感谢。★★★★★ 在Python中&#xff0c;struct模块提供了二进制数据的打包和解包…

使用transformers生成文本Generating text with transformers

到目前为止&#xff0c;您已经看到了Transformers架构内部的一些主要组件的高级概述。但您还没有看到从头到尾的整体预测过程是如何工作的。让我们通过一个简单的例子来了解。在这个例子中&#xff0c;您将查看一个翻译任务或一个序列到序列的任务&#xff0c;这恰好是Transfor…

破解难题:如何应对项目中的‘老油条’障碍

引言 在项目管理的实践中&#xff0c;我们经常遇到各种各样的人员挑战。其中&#xff0c;有一种特殊的挑战被称为“老油条”现象。这些“老油条”通常在表面上表现得非常配合&#xff0c;但在实际工作中却常常没有任何进展。这种情况不仅会影响项目的进度&#xff0c;还可能对…

机器学习---常见的距离公式(欧氏距离、曼哈顿距离、标准化欧式距离、余弦距离、杰卡德距离、马氏距离、切比雪夫距离、闵可夫斯基距离、K-L散度)

1. 欧氏距离 欧几里得度量&#xff08;euclidean metric&#xff09;&#xff08;也称欧氏距离&#xff09;是一个通常采用的距离定义&#xff0c;指在m维空 间中两个点之间的真实距离&#xff0c;或者向量的自然长度&#xff08;即该点到原点的距离&#xff09;。在二维和三维…

Spring(16) Aware结尾的类整理

目录 一、什么是 Aware 结尾的类&#xff1f;二、常见的 Aware 实现接口三、Aware 实现原理 一、什么是 Aware 结尾的类&#xff1f; 在 Spring Boot 中&#xff0c;以 Aware 结尾的类通常是一些继承了 Aware 接口的接口类&#xff0c;它们用于使 Bean 获取某些特定的能力或资…

AJAX的POST请求在chrome浏览器报net::ERR_CONNECTION_RESET问题

背景说明 公司对前端的所有的AJAX请求做了统一的封装&#xff0c;因此业务上需要发起请求调用后端服务时&#xff0c;使用的都是公司封装好的工具。 由于ERR_CONNECTION_RESET问题比较粗&#xff0c;也就是说可能会有很多原因会导致浏览器报这个错&#xff0c;因此在网上可以…

clion软件ide的安装和环境配置@ubuntu

1.官网&#xff1a; Download CLion 2.安装Clion 直接在官网下载并安装即可&#xff0c;过程很简单 https://www.jetbrains.com/clion/ https://www.jetbrains.com/clion/download/#sectionlinux 3.激活码 4.配置Clion 安装gcc、g、make Ubuntu中用到的编译工具是gcc©…