02.案列项目Demo

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()

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

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

相关文章

Hi-TRS:骨架点视频序列的层级式建模及层级式自监督学习

论文题目&#xff1a;Hierarchically Self-Supervised Transformer for Human Skeleton Representation Learning 论文下载地址&#xff1a;https://www.ecva.net/papers/eccv_2022/papers_ECCV/papers/136860181.pdf 代码地址&#xff1a;https://github.com/yuxiaochen1103…

私有化部署即时通讯平台,30分钟替换钉钉和企业微信

随着企业对即时通讯和协作工具的需求不断增长&#xff0c;私有化部署的即时通讯平台成为企业的首选。WorkPlus作为有10余年行业深耕经验与技术沉淀品牌&#xff0c;以其安全高效的私有化部署即时通讯解决方案&#xff0c;帮助企业在30分钟内替换钉钉和企业微信。本文将深入探讨…

iOS17 widget Content margin

iOS17小组件有4个新的地方可以放置分别是&#xff1a;Mac桌面、iPad锁屏界面、 iPhone Standby模式、watch的smart stack Transition to content margins iOS17中苹果为widget新增了Content margin, 使widget的内容能够距离边缘有一定的间隙&#xff0c;确保内容显示完整。这…

HTTPS证书如何申请?只需这五个步骤

在如今的互联网时代&#xff0c;网络安全变得愈发重要。为了保障网站内数据的安全&#xff0c;许多网站都开始使用HTTPS协议来进行数据传输。而谷歌、百度等搜索巨擘启用全站HTTPS加密服务&#xff0c;更是掀起了网站HTTPS加密的浪潮。那么申请HTTPS证书都需要什么&#xff1f;…

React(7)

1.React Hooks 使用hooks理由 1. 高阶组件为了复用&#xff0c;导致代码层级复杂 2. 生命周期的复杂 3. 写成functional组件,无状态组件 &#xff0c;因为需要状态&#xff0c;又改成了class,成本高 1.1 useState useState();括号里面处的是初始值&#xff1b;返回的是一个…

接口自动化框架(Pytest+request+Allure)

前言&#xff1a; 接口自动化是指模拟程序接口层面的自动化&#xff0c;由于接口不易变更&#xff0c;维护成本更小&#xff0c;所以深受各大公司的喜爱。 接口自动化包含2个部分&#xff0c;功能性的接口自动化测试和并发接口自动化测试。 本次文章着重介绍第一种&#xff0c…

Python Opencv实践 - 直方图显示

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像直方图计算 #cv.calcHist(images, channels, mask, histSize, ranges, hist, accumulate) #images&…

爱校对发布全新PDF校对工具,为用户带来更为便捷的校正体验

随着数字化文档使用的普及&#xff0c;PDF格式已经成为最为广泛使用的文件格式之一。为满足广大用户对于高效、准确PDF文档校对的需求&#xff0c;爱校对团队经过深入研发&#xff0c;正式推出全新的PDF校对工具&#xff01; 这一全新工具针对PDF文件格式进行了深度优化&#…

TRON归集回调

简介 设计一个通过调用api创建对应的tron地址&#xff0c;当地址收到token的时候&#xff0c;进行归集&回调通知的。包括的功能有: 根据UID创建地址归集&#xff08;TRX归集 TRC10归集 TRC20归集)回调通知&#xff08;转出回调通知&接收回调通知&#xff09;发起转出…

vue组件的scope 以及 如何样式穿透

个人复习&#xff01;&#xff01;&#xff01; 有什么用 让当前组件的样式不会修改到其它地方的样式&#xff0c;使用了data-v-hash的方式来使css有了它对应模块的标识 实现原理 1、给HTML的dom节点添加一个不重复的data属性(例如: data-v-5558831a)来唯一标识这个dom 元素…

Four Operations

一、题目 Little Ruins is a studious boy, recently he learned the four operations! Now he want to use four operations to generate a number, he takes a string which only contains digits ‘1’ - ‘9’, and split it into 5 5 intervals and add the four operat…

LRU淘汰策略执行过程

1 介绍 Redis无论是惰性删除还是定期删除&#xff0c;都可能存在删除不尽的情况&#xff0c;无法删除完全&#xff0c;比如每次删除完过期的 key 还是超过 25%&#xff0c;且这些 key 再也不会被客户端访问。 这样的话&#xff0c;定期删除和堕性删除可能都彻底的清理掉。如果…

设计模式——接口隔离原则

文章目录 基本介绍应用实例应传统方法的问题和使用接口隔离原则改进 基本介绍 客户端不应该依赖它不需要的接口&#xff0c;即一个类对另一个类的依赖应该建立在最小的接口上先看一张图: 类 A 通过接口 Interface1 依赖类 B&#xff0c;类 C 通过接口 Interface1 依赖类 D&…

A 题国际旅游网络的大数据分析-详细解析与代码答案(2023 年全国高校数据统计与调查分析挑战赛

请你们进行数据统计与调查分析&#xff0c;使用附件中的数据&#xff0c;回答下列问题&#xff1a; ⚫ 问题 1: 请进行分类汇总统计&#xff0c;计算不同国家 1995 年至 2020 年累计旅游总人数&#xff0c;从哪个国家旅游出发的人数最多&#xff0c;哪个国家旅游到达的人数最多…

19.图,图的两种存储结构

目录 一. 一些基本概念 二. 图的抽象数据类型定义 三. 图的存储结构 &#xff08;1&#xff09;数组表示法&#xff08;邻接矩阵表示法&#xff09; &#xff08;a&#xff09;邻接矩阵 &#xff08;b&#xff09;存储表示 &#xff08;c&#xff09;优缺点分析 &#x…

前端工程化概述

软件工程定义&#xff1a;将工程方法系统化地应用到软件开发中 前端发展历史 前端工程化的发展历史可以追溯到互联网的早期阶段&#xff0c;随着前端技术的不断演进和互联网应用的复杂化&#xff0c;前端工程化也逐渐成为了前端开发的重要领域。以下是前端工程化的主要发展里程…

【了解一下常见的设计模式】

文章目录 了解一下常用的设计模式(工厂、包装、关系)导语设计模式辨析系列 工厂篇工厂什么是工厂简单工厂「模式」&#xff08;Simple Factory「Pattern」&#xff09;简单工厂代码示例&#xff1a;简单计算器优点&#xff1a;缺点&#xff1a; 静态工厂模式特点&#xff1a; 工…

手搭手入门MyBatis-Plus

MyBatis-Plus Mybatis-Plus介绍 为简化开发而生 MyBatis-Plus(opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis(opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性 无侵入&#…

protobuf+netty自定义编码解码

protobufnetty自定义编 项目背景 protobufnetty自定义编码解码 比如心跳协议&#xff0c;客户端请求的协议是10001&#xff0c;在java端如何解码&#xff0c;心跳返回协议如何编码&#xff0c;将协议号带过去 // 心跳包 //10001 message c2s_heartbeat { }//10002 message …

LeetCode--HOT100题(38)

目录 题目描述&#xff1a;226. 翻转二叉树&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;226. 翻转二叉树&#xff08;简单&#xff09; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 LeetCode做题链…