zoukankan      html  css  js  c++  java
  • Django(2)

    简易版本web简易流程图

    Django第二天:Django实现登录功能

    实现以下功能:

    静态文件配置
    form表单提交数据后端如何获取
    request方法
    pycharm连接数据库  django使用mysql数据库
    django orm简介
    表字段的增删改查
    表数据的增删改查
    

    pycharm创建项目的的的时候,应用不勾选。如图所示——没有这个应用了!

    pycharm内使用代码创建应用:

    python3 manage. py startapp app01
    

    现在去settings注册(如下两种方式)

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        # 'app01'  # 简写
        'app01.apps.App01Config'  # 全称
    ]
    

    html文件默认全都放在templates文件夹下

    对于前段已经写好了的文件 我们只是拿过来使用 那么这些文件都可以称之为叫"静态文件"
    静态文件可以是

    1bootstrap一类的前段框架 已经写好了的
    2图片
    3css
    4js
    

    ​ 静态文件默认全都放在static文件夹下

    static文件夹中默认会默认创建的子文件夹
    css文件夹  当前网站所有的样式文件
    js文件  当前网站所有的js文件
    img文件  当前网站所有的图片文件
    其他(前端框架代码 第三方插件代码...)
    

    后端资源一般都需要手动指定是否需要暴露给用户.

    STATIC_URL = '/static/'  # 这个static不是文件夹的名字 而是接口前缀
    	"""只要你想访问静态文件中的资源 文件路径就必须用static开头"""
    	# 手动将static文件夹中所有的资源暴露给用户
    	STATICFILES_DIRS = [
    		os.path.join(BASE_DIR,'static'),  # 真正的文件夹路径
    		os.path.join(BASE_DIR,'static1'),  # 真正的文件夹路径
    		os.path.join(BASE_DIR,'static2'),  # 真正的文件夹路径
    		os.path.join(BASE_DIR,'static3')  # 真正的文件夹路径
    	]
    

    现在,你只要在地址栏输入static文件夹内具体文件的路径就能够访问到。之前本地的css样式无法显示,现在就可以了

    前缀接口:

    注意两个static的区别:一个前缀一个文件名。

    ​ 去列表中,一个一个的找

    静态文件接口前缀"动态解析":防止别人找事!

    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
    利用解析器 动态获取接口前缀 
    

    设置完动态解析,STATIC_URL = '/static/',这个static就可以替换为任意的内容了

    注意事项:

    1 启动ddjango项目的时候 一定要确保一个端口号只有一个django项目在占用
    不然的话 会容易造成bug

    2 用户可以访问的资源 都在url中
    只有url中开设相关的资源你才能访问到(****)

    3.浏览器缓存清理:明明代码改了,但是页面没有变化

    4.Django的自动重启机制

        django默认是支持自动重启代码的 所以你只需要多刷新几次页面就可以
    但是有时候它的重启机制比较慢
    机制:实时监测文件代码变化 只要有变化 就会自动重启 
    可能你的代码还没有写完 这个时候就会自动报错
    

    5.django小白必会三板斧

    	HttpResponse:返回字符串
    	render:返回html页面 并且能够给该页面传值
    	redirect:重定向
    

    login没有样式的问题:是因为pycharm中是本地地址。这个跟手动在地址栏敲地址一样,所以没有样式

    解决方法:

    1,在url写

    2,django解决方法(之后将..去掉):

    现在static中的文件全部暴露了。现在网页地址就可以访问本地static文件夹下的内容了

    动态解析:防止别人找事

    form表单中,action默认不写的话,则往当前地址发送请求,即刚刚的login函数这里!

    form表单提交数据目的地由action# action在右边 --->    <form action="" method="post">
    	1.不写的情况下 默认往当前地址提交
    	2.还可以写后缀/index/(将项目常用这种)
    	3.还可以写全路径
    

    form表单默认是get请求

    携带数据的方式是url问好后跟数据
    http://127.0.0.1:8000/login/?username=zekai&password=123
    

    可以通过method改为post请求
    改成post请求之后 需要去settings文件中注释掉一个中间件

    MIDDLEWARE = [
    			'django.middleware.security.SecurityMiddleware',
    			'django.contrib.sessions.middleware.SessionMiddleware',
    			'django.middleware.common.CommonMiddleware',
    			# 'django.middleware.csrf.CsrfViewMiddleware',#就是这里
    			'django.contrib.auth.middleware.AuthenticationMiddleware',
    			'django.contrib.messages.middleware.MessageMiddleware',
    			'django.middleware.clickjacking.XFrameOptionsMiddleware',
    		]
    

    现在:打开页面是get请求,提交按钮是post。因为默认是get请求

    HttpResponse

    会跳转到一个新的页面:

    这样写,会在页面展示

    现在获取前端数据

    request.method:

    获取请求方式(get/post)全大写字符串

    requst是封装wsgire,封装成类,可以通过点的方式取值。如下request.的方法

    获取数据分为get和post取值。两种方式

    1.GET取值:

    ​ 1.1去一个值(并且是最后一个值):request.GET.get(内容)

    ​ 1.2取多个值:request.GET.getlist('hobby')

    request.GET获取前端get提交的所有数据!(就类似于是一个大字典)
    
    取值
    request.GET.get('username')  # 虽然value是一个列表 但是默认只取列表最后一个元素
    # 强烈不建议你使用中括号的形式取值
    password = request.POST['password']
    # 如果想直接把列表全部取出(******)
    request.GET.getlist('hobby')
    
    2.POST取值:

    ​ 2.1取一个值(并且是最后一个值):request.POST.get(内容)

    ​ 2.2取多个值:request.POST.getlist('hobby')

    request.POST获取前端post提交的数据(就类似于是一个大字典)
    # request.POST:<QueryDict: {'username': ['dsafsdafd'], 'password': ['fsdaaaaaaaaaaaa']}>
    取值
    request.POST.get('username')  #默认只取列表最后一个元素
    # 强烈不建议你使用中括号的形式取值
    # 如果想直接把列表全部取出(******)
    request.POST.getlist('hobby')
    

    为什么要用列表?(request.POST默认是value值默认用列表形式)

    <QueryDict: {'username': ['dsafsdafd'], 'password': ['fsdaaaaaaaaaaaa']}>
    

    因为接受多个input框!!

    <QueryDict: {'username': ['dfsfafsda', '23'], 'password': ['54225'], 'hobby': ['basketball', 'football', 'qianball']}>
    

    提示:debug和print要结合使用

    pycharm链接数据库

    pycharm链接数据库:在此之前只知道其他软件可以操作数据库

    pycharm数据库的配置

    Sqlite数据库:

    ​ django默认使用的是自带的sqlite数据库 ,对日期不是很精确。

    Django数据库的替换(非常重要):

    如果你想让它其他的数据库 需要在settings配置文件中 配置

    1.settings文件中配置
    			DATABASES = {
    				'default': {
    				'ENGINE': 'django.db.backends.mysql',
    				'NAME': 'day51',
    				'HOST':'127.0.0.1',
    				'PORT':3306,
    				'USER':'root',
    				'PASSWORD':'123',
    				'CHARSET':'utf8'
    			}
    2.还要在项目名下的init文件或者是应用名下的init文件中告诉django不要使用默认的mysqldb连接mysql
    而是使用pymysql
    import pymysql
    pymysql.install_as_MySQLdb()
    

    ORM简介:

    强调:django不会帮你创建库,需要你自己手动创建库,它只能帮你创建表(建议你一*个django就新建一个数据库)

    models.py创建模型类

    django会默认给你的表创建一个名为id的主键字段,除非你指定主键名不叫ID:

    uid = models.AutoField(primary_key=True)
    

    django没有char字段,但可以自定义,后面讲。

    class User(models.Model):
    			# 将id字段设置为User表主键字段  在django orm中 你可以不写主键字典  django会默认给你的表创建一个名为id的主键字段
    			# id = models.AutoField(primary_key=True)  # 一旦你自己指定了主键字段 那么django就不会自动再帮你创建了
    			username = models.CharField(max_length=32)  # username varchar(32)   CharField必须要指定max_length参数
    			password = models.IntegerField()  # password int
    

    需要执行数据库迁移(同步)命令

    python3 manage.py makemigrations  # 仅仅是在小本本上(migrations文件夹)记录数据库的修改 并不会直接操作数据
    python3 manage.py migrate  # 将数据库修改记录 真正同步到数据库
    
    

    注意:只要动了models中跟数据库相关的代码 就必须重新执行上面的两条命令 缺一不可(******)

    也可以简写:

    tools
    	run manage.py task
    

    比如:print()的时候自动执行,根本没有修改数据库数据

    def __str__(self):
        return self.username
    

    表字段的增删改查

    1.增

    当一张表已经创建出来之后 后续还想添加字段,可以有两种方式(二选一)

    1.default= 默认值。给新增的字段设置默认值

    addr = models.CharField(max_length=32,default='China')  # default该字段默认值
    

    2.null=True给新增的字段设置成可以为空

    age = models.IntegerField(null=True)  # 该字段允许为空
    
    2.删(慎用)

    ​ 删除字段 直接在models.py中注释该字段 然后重新执行两条命令即可
    注意:执行完之后 表中该字段所对应的所有的数据全部删除
    并且一般情况下 基本是不会用到真正意义上的删除

    增加数据库——必须指定默默认值或者null=True

    在django里:数据库的删除————就是注释(之后重新执行两条命令)!!因此不能瞎注释

    事实上不会删除任何数据,否则数据库的设计不合理,一般通过is_delete=0或1标示删除或存在

    数据的增删改查(表记录)

    	from app01 import models
    	
    	models.User.objects.all()  # 直接拿所有的数据
    	
    	models.User.objects.get(username=username)  
    	
    	res = models.User.objects.filter(username=username)
    	res.query 
    	
    	user_obj = res.first()
    
    查到被封装的sol语句?
    print (res. query)# 只有querySet对象才可以直接点query查看年内部对应的sql语句
    

    filter拿到的结果就是一个querySet对象(你现在只需要知道filter拿到的结果就能够点query查看sql语句)

    SELECT `app01_user`.`id`, `app01_user`.`username`, `app01_user`.`password` FROM `app01_user` WHERE (`app01_user`.`username` = jason AND `app01_user`.`password` = 123)
    

    querySet对象 你可以吧它当做列表操作 取值也可以通过索引取(querySet只支持正数索引 不支持负数) 还支持切片操作(切出来的结果还是一个querySet对象)但是不推荐你这么做

    print(res)
    user_obj = res[0:2]
    

    取值呢:.first()....

    	可用索引,但不推荐用。有自己独特的方法:.first()....
    
    	但是first的内部还是通过索引取出,它做的优化就是防止索引不存在时,不报错
    

    方法2:filter():结果是列表

    查询结果列表套对象

    res = models.User.objects.filter(username=username,password=password)
    # 这是截图的,<QuerySet [ User:我是user表中的对象: jason>, <User: 我是user表中的对象: jason>]>
    
    <QuerySet [<User: 我是user表中的对象:wuxi>]>
    filter查询出来的结果是一个"列表 列表内放的才是一个个的数据对象本身"
    当查询条件不存在的时候 不会报错 只会返回一个空列表
    filter括号内 支持写多个参数  并且参数与参数之间是and的关系
    

    2.新增用户

    补充:**{...} ————>username=ss

    2.1create()

    models.User.objects.create(username=username,password=password)# insert into user(username,password) values(username,password)
    create方法能够新增数据 并且有一个返回值# 返回值就是新增的数据对象本身
    

    2.2利用对象绑定方法

    user_obj = models.User(username=username,password=password)
    user_obj.save()
    

    删除用户

    models.User.objects.filter(条件).delete()
    

    3修改用户:update(**kwargs)

    models.User.objects.filter(条件).update()
    
    用户的增删改查
    	1.通过orm展示所有的到前端
    		all()
    		模板语法for循环
    	2.添加新增按钮 (用户的新增操作)
    		a标签的href直接触发后端逻辑
    		create()
    	3.添加编辑 删除按钮
    		编辑
    		删除
    			利用get请求携带参数的特点  在url的后面跟上对应数据的id值
    			request.GET.get()
    			
    			如果是编辑 
    				重新渲染一个页面 将编辑对象传递到前端
    			
    			如果是删除
    				直接利用filter(...).delete()
  • 相关阅读:
    数据库表结构变动发邮件脚本
    .net程序打包部署
    无法登陆GitHub解决方法
    netbeans 打包生成 jar
    第一次值班
    RHEL6 纯命令行文本界面下安装桌面
    C语言中格式化输出,四舍五入类型问题
    I'm up to my ears
    How to boot ubuntu in text mode instead of graphical(X) mode
    the IP routing table under linux@school
  • 原文地址:https://www.cnblogs.com/ZDQ1/p/11542748.html
Copyright © 2011-2022 走看看