首页 > 其他分享 >【2022-08-31】Django框架(二)

【2022-08-31】Django框架(二)

时间:2022-08-31 21:34:08浏览次数:60  
标签:name models 08 request 数据库 2022 POST django 31

Django框架(二)

静态文件及相关配置

1.静态文件
	html页面上使用的不经常改变的资源
        1.第三方框架文件,如Bootstrap框架
        2.css样式文件
        3.网站js文件
        4.image图片文件
        
   	针对静态文件资源一般都会放在static文件夹内
    	当static目录下出现了很多不同类型的静态文件资源 那么还可以分类管理
            others文件夹
            	第三方框架文件
            css文件夹
            	所有的css文件
            js文件夹
            	所有的js文件
            img文件夹
            	所有的img文件
       
2.针对静态文件资源的访问也需要提前开设相应的接口
    STATIC_URL = '/static/'
    # 静态文件资源配置,可以定义多个静态文件,且路径查找顺序是从上而下的
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static')
    ]
  
3.接口前缀
	STATIC_URL = '/static/'  # 接口前缀可以更改,但更改后原有的前缀就会失效,需要指定为更改后的前缀
 	
4.动态解析
	{% load static %}
   <link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">

静态文件配置实例

views.py

from django.shortcuts import render, HttpResponse, redirect


# Create your views here.

def login(request):
    # 1.给前端返回一个登录页面
    return render(request, 'login.html')

urls.py

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login),
]

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
{#    <link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">#}
{#    <script src="/static/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>#}
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
</head>
<body>
        <div class="container">
            <div class="row">
                <h1 class="text-center">用户登录</h1>
                <div class="col-md-8 col-md-offset-2">
                    <form action="">
                        <p>username:<input type="text" name="username" class="form-control"></p>
                        <p>password:<input type="text" name="password" class="form-control"></p>
                        <input type="submit" value="登录" class="btn btn-block btn-danger">
                    </form>
                </div>
            </div>
        </div>

</body>
</html>

实例验证

http请求方法

"""
URL:统一资源定位符(网址)
"""
1.GET请求
	朝别人索要数据	
        也可以携带额外的数据
        	url?xxx=yyy&zzz=ooo&aaa=bbb
        上述携带数据的方式有两个限制
        	1.数据只能是一些无关紧要的非敏感数据
        	2.数据大小有限制 2KB~4KB左右
        GET请求没有请求体(HTTP数据格式)
2.POST请求
	朝别人提交数据
        也可以携带额外的数据
        数据都是放在请求体中 并且数据大小没有限制
            
3.form表单默认的数据提交方式是get
	method = 'post'
 	action  控制数据的提交地址
       方式1:不写 朝当前页面所在的地址提交
       方式2:写后缀 /index/  自动补全ip和port
       方式3:写全称 https://www.baidu.com/

4.提交post请求前期需要去settings配置文件中注释一行代码
	MIDDLEWARE = [
    # 'django.middleware.csrf.CsrfViewMiddleware',
]

request对象方法

request.method			 获取请求方式 结果是纯大写的字符串
request.POST  			 获取请求体发送来的普通数据(不包含文件)
request.POST.get()     		 默认只获取列表中最后一个数据值
request.POST.getlist()  	 获取键对应的整个列表,无论有几个数据值
request.GET	   		 获取url后面携带的非敏感数据
request.GET.get()     		 默认只获取列表中最后一个数据值
request.GET.getlist()  		 获取键对应的整个列表,无论有几个数据值


from django.shortcuts import render, HttpResponse, redirect


# Create your views here.

def login(request):
    """该函数会通过不同的请求方式触发,并且需要执行不同的业务逻辑代码"""
    # print(request.method)
    # if request.method == 'GET':
    #     # 1.给前端返回一个登录页面
    #     return render(request, 'login.html')
    # elif request.method == 'POST':
    #     # 2.获取用户数据
    #     # print(request.POST)             # <QueryDict: {'username': [''], 'password': ['']}>
    #     res = request.POST.get('username')
    #     print(request.GET)
    #     return HttpResponse('登录成功')
    if request.method == 'POST':
        print(request.POST)
        return HttpResponse('登录成功')
    return render(request, 'login.html')

pycharm连接mysql数据库

查找pycharm提供的database按钮,如下图:

首次链接数据库需要下载对应的驱动,如下图:

实现简单的增删改查,如下图:

Django连接mysql数据库

django默认使用的是sqlite3 但是这款数据库一般只用于本地测试 功能较少

settings配置文件中,数据库默认配置为:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


1.settings配置文件中修改配置即可
	DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 指定数据库软件名称
        'NAME': 'day55',  # 指定库名
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'CHARSET': 'utf8'
    }
}
    
2.指定链接MySQL的模块

	django1.11 版本需要在项目或者应用目录下的__init__.py中编写一行代码
            import pymysql
            pymysql.install_as_MySQLdb()
            
  	django2.2 以上版本需要使用mysqlclient模块
    	    pip install mysqlclient

Django orm简介

ORM (Object Realtional Mapping)即对象关系映射,它是一种基于关系型数据库的程序技术。ORM 允许你使用类和对象对数据库进行操作,这大大提高了对数据库的控制,避免了直接使用 SQL 语句对数据库进行操作。

Web 开发中对数据库的操作是必不可少的,然而每种数据库的操作方式以及用法不尽相同。由于 Django 中 ORM 的存在,为我们操作不同种类的数据库提供了统一的方法,ORM 适配了多种常用的关系型数据库,例如 PostgreSQL、MySQL、Oracle、Sqlite3 等。

from django.db import models


# Create your models here.

# 1.定义一个模型类
class User(models.Model):  # 类似于定义了表名
    id = models.AutoField(primary_key=True)  # 类似于定义了主键
    # 对应的sql语句 id int primary key auto_increment
    name = models.CharField(max_length=32)  # 类似于定义了字段
    # 对应的sql语句  name varchar(32)
    pwd = models.IntegerField()  # 类似于定义了字段
    # 对应的sql语句  pwd int
    
    
1.数据库迁移/同步命令
	1.将models中有关数据库的操作记录下来(migrations文件夹)
		python3 manage.py makemigrations
 	2.将操作真正影响到数据库中
    	python3 manage.py migrate
	'''当修改了models中与数据库相关的代码 都必须执行上述的命令,先执行makemigration,后执行migrate'''
	
    
2.表的主键在orm中 可以不写 orm会自动帮你添加一个id的主键
	如果你需要主键的名称不叫id 只能自己创建

数据库迁移/同步命令可以简写,也可以指定应用单独迁移/同步,在pycharm中,点击上方Tools,选择Run manage.py Task即可弹出,如下图所示:

ORM语法及基本操作

1.查
	models.User.objects.filter()  结果可以看成是一个列表套数据对象
	如何获取对象 可以使用first()方法 如果没有值会返回None 使用if判断即可
2.增
	models.User.objects.create()
3.改
	models.User.objects.filter(id=1).update(name='jasonNB')
4.删
	models.User.objects.filter(id=4).delete()
    
    	if request.method == 'POST':
        # print(request.POST)
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 查询表数据
        # res = models.User.objects.filter(name=username, pwd=password).first()
        # print(res)                  # <QuerySet [<User: User object (1)>]>  列表套对象
        # 新增表数据
        # models.User.objects.create(name=username, pwd=password)
        # 修改表数据
        # models.User.objects.filter(id=4).update(name='lisa')
        # 删除表数据
        models.User.objects.filter(id=4).delete()
        # user_obj = res[0]
        # if user_obj:
        #     print(user_obj.id)          # 1
        #     print(user_obj.name)        # tony
        #     print(user_obj.pwd)         # 666
        #     return HttpResponse('登录成功')
        # return HttpResponse('用户名或密码错误')
    return render(request, 'login.html')

ORM外键关联

MySQL
    一对多
    	外键字段建在多的一方
    多对多
    	外键字段建在第三张关系表
    一对一
    	外键字段建在查询频率较高的表中
	
ORM
	一对多
    	外键字段建在多的一方
        class Book(models.Model):
        title = models.CharField(max_length=32)
        # 书与出版社是一对多  书是多
        publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)

 	多对多
    	外键字段可以直接写在某张表中 orm会自动帮你创建第三张表
         class Publish(models.Model):
		pub_name = models.CharField(max_length=32)
         # 书与作者是多对多  在mysql中多对多需要额外自己创建一张表)
         author = models.ManyToManyField(to='Author')

   一对一
    	外键字段建在查询频率较高的表中
    
		class Author(models.Model):
    	name = models.CharField(max_length=32)
    	# 作者与作者详情是一对一  外键建立在查询频率较高的表中
    	detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)
    
    
        class AuthorDetail(models.Model):
            phone = models.BigIntegerField()

标签:name,models,08,request,数据库,2022,POST,django,31
From: https://www.cnblogs.com/dy12138/p/16644592.html

相关文章

  • 2022-08-30 第五组 赖哲栋 学习笔记
    Servlet除了form表单之外都是get请求HttpServletRequest---req——请求所有请求的操作都用req对象来处理当有请求来的时候,req就被实例化HttpServletResponse---res......
  • 2022-08-31 第五组 赖哲栋 学习笔记
    JSPJSP脚本片段:用于在JSP页面写java代码<%%><%intnum=0;num++;System.out.println(num);//向页面打印输出out.print(num);%>注意事项......
  • ak日记 831 dxm
    importsysfrommathimportinfline=sys.stdin.readline().strip()vs=list(map(int,line.split()))n,k=vs[0],vs[1]line=sys.stdin.readline().strip()......
  • 2022-08-31 第二小组 张晟源(javaweb,el,jstl,分页查询)
    JavaWeb一,JSPJSP(全称JavaServerPages),运行在服务端的语言<%//java代码%>1.JSP脚本只能有java代码,在访问JSP时,JSP引擎翻译JSP页面中的脚本2.J......
  • 2022-8-31 第一组 (≥▽≤) 学习笔记
    目录1.JSPJSP表达式JSP声明片段JSP的指令标识JSP标签内置标签JSTL标签自定义标签JSP的作用域2.EL表达式EL表达式的内置作用域对象EL表达式的缺陷面试题1.JSPJSP脚本片段:......
  • 20220829 第一组 于芮 Vue坏人Tomcat入门
     小白成长记——第三十七天    这几天的主要学习内容就是Vue以及简单的Tomcat在ideal中的配置,总体来说说学习内容很多,每天都很充实,时间都用来学习,整个人都很开心......
  • 08. Prometheus - 查询持久化与服务发现
    查询持久化前面编写的PromQL都是一次性的,下次使用需要重写编写。为了方便以后拿来即用,Prometheus提供了在配置文件中的持久化方案。cd/ezops/service/prometheus/con......
  • 2022-08-31
    1、因为.trimmed()方法不能去除字节之间的空格,而只能去除整个数据包的前后空格,所以为了方便起见而又不脱离方便人阅读的情况下,需要在写入txt时不能使用.toHex(‘’),也就是......
  • 数据结构第一天 -831
    要点解决问题方法的效率,跟空间的利用效率有关解决问题方法的效率,跟算法的巧妙程度有关上述问题中,如果按照题目给定的式子去写程序,利用次方的关系写,就是f1对应的关系,实......
  • 前端面试题每日3题——2022/08/30
    1以下代码执行后,控制台中的输出内容为?for(leti=0;i<3;i++){setTimeout(()=>{console.log(i);});}for(varj=0;j<3;j++){setTimeout......