Django框架

一、Django基本操作

# 命令行操作
	# 1. 创建django项目
	django-admin startproject mysite

	# 2. 启动项目
	cd /mysite
	python manage.py runserver

	# 3. 创建应用(一个app就是独立的功能模块)
	python manage.py startapp app01
        
  
# pycharm操作
    # 1. new project 选择左侧第二个django即可
  
    # 2. 启动
  		1. 用命令行启动
    	2. 或者点击绿色小箭头即可

    # 3. 创建应用
  		1. pycharm提供的终端直接输入完整命令
    	2. pycharm -> 工具 -> 运行manage.py任务(前期不要用 给我背完整命令)
    # 4. 修改端口号	
		编辑配置....

二、主要文件介绍

-mysite项目文件夹
  --mysite文件夹
    ---__init__.py
    ---asgi.py
  	---settings.py	   # 配置文件
    ---urls.py			# 路由与视图函数对应关系(路由层)
    ---wsgi.py			# wsgiref模块(不考虑)
  --manage.py			# django的入口文件
  --db.sqlite3			# django自带的sqlite3数据库(小型数据库 功能不是很多 还有bug)
  --app01文件夹
	---__init__.py
  	---admin.py			# django后台管理
    ---apps.py			# 注册使用
    ---migrations文件夹  # 数据库迁移记录
    ---models.py		# 数据库相关的 模型类(orm)
  	---tests.py			# 测试文件
    ---views.py			# 视图函数(视图层)

三、APP(应用)

"""
django是一款专门用来开发app的web框架

django框架就类似于是一所大学(空壳子)
app就类似于大学里面各个学院(具体功能的app)
	比如开发淘宝
		订单相关
		用户相关
		投诉相关
		(创建不同的app对应不同的功能)
	
	选课系统
		学生功能
		老师功能

一个app就是一个独立的功能模块
"""
## ***********************创建的应用一定要去配置文件中注册**********************
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',  # 全写
  	'app01',			 # 简写
]
# 创建出来的的应用第一步先去配置文件中注册 其他的先不要给我干
# ps:你在用pycharm创建项目的时候 pycharm可以帮你创建一个app并且自动注册
***********************************************************************

四、Templates(模板)

# 命令行创建不会自动有templates文件夹 需要你自己手动创建,而pycharm会自动帮你创建并且还会自动在配置文件中配置对应的路径
# pycharm创建
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
]
# 命令行创建
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
]
"""
也就意味着你在用命令创建django项目的时候不单单需要创建templates文件夹还需要去配置文件中配置路径
'DIRS': [os.path.join(BASE_DIR, 'templates')]

五、HttpResponse、render、redirect

"""
HttpResponse
	返回字符串类型的数据

render
	返回html文件的

redirect
	重定向
	return redirect('https://www.mzitu.com/')
	return redirect('/home/')
""" 

六、Static(静态文件)

1. satic文件

# 前端写好了的,能够直接调用使用的都称之为静态文件
    # 1. 网站写好的js文件
    # 2. 写好的css文件
    # 3. 网站用到的图片文件
    # 4. 第三方插件等等

# 需要手动创建static文件夹

2. static文件配置

STATIC_URL = 'static/'  # 类似于访问静态文件的令牌

# 静态文件配置(多个静态文件)
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR,'static1'),
    os.path.join(BASE_DIR,'static2'),
]

3. 静态文件动态解析

# 静态文件动态解析
{% 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>

4. form表单提交数据,及action参数

# form表单默认是get请求数据
http://127.0.0.1:8000/login/?username=Deeo&password=123
"""
form表单action参数
	1.不写 默认朝当前所在的url提交数据
	2.全写 指名道姓
	3.只写后缀 /login/
"""

5. CSRF

# 在django中默认启动csrf校验,当用户发起post请求时,必须携带csrf_token参数

# 要在全局禁用csrf校验,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',
]

七、request对象方法初识

1. 方法

request.method # 返回请求方式 并且是全大写的字符串形式  <class 'str'>
request.POST  # 获取用户post请求提交的普通数据不包含文件
    request.POST.get()  # 只获取列表最后一个元素
    request.POST.getlist()  # 直接将列表取出
request.GET  # 获取用户提交的get请求数据
    request.GET.get()  # 只获取列表最后一个元素
    request.GET.getlist()  # 直接将列表取出
"""
get请求携带的数据是有大小限制的 大概好像只有4KB左右
而post请求则没有限制
"""

2. 案例

  def login(request):
    # 返回一个登陆界面
    """
    get请求和post请求应该有不同的处理机制
    :param request: 请求相关的数据对象 里面有很多简易的方法
    :return:
    """
    # print(type(request.method))  # 返回请求方式 并且是全大写的字符串形式  <class 'str'>
    # if request.method == 'GET':
    #     print('来了 老弟')
    #     return render(request,'login.html')
    # elif request.method == 'POST':
    #     return HttpResponse("收到了 宝贝")
    
    if request.method == 'POST':
        return HttpResponse("收到了 宝贝")
    return render(request, 'login.html')

3. request.POST结果

request.POST # 结果是一个字典   
# <QueryDict: {'username': ['Deeo'], 'password': ['123']}
# 值是列表
request.POST.get('password')   # 'password'
# 取password这个键的值列表中的最后一个值

# 如何取值列表呢
request.POST.getlist('password')  ## ['password']

八、django链接数据库(MySQL)

# 默认用的是sqlite3
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

# django链接MySQL
	1.第一步配置文件中配置
  	DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'day60',
        'USER':'root',
        'PASSWORD':'admin123',
        'HOST':'127.0.0.1',
        'PORT':3306,
        'CHARSET':'utf8'
    }
}
	2.代码声明	
  	# django默认用的是mysqldb模块链接MySQL
    # 但是该模块的兼容性不好 需要手动改为用pymysql链接
    
    # 你需要告诉django不要用默认的mysqldb,要用pymysql
    # 在项目名下的__init__或者任意的应用名下的__init__文件中书写以下代码都可以
    import pymysql
	pymysql.install_as_MySQLdb()

九、Django ORM

"""
ORM. 对象关系映射
作用:能够让一个不用sql语句的小白也能够通过python 面向对象的代码简单快捷的操作数据库
不足之处:封装程度太高 有时候sql语句的效率偏低 需要你自己写SQL语句

类										表

对象									   记录
	
对象属性							记录某个字段对应的值

应用下面的models.py文件
"""

# 1 先去models.py中书写一个类
class User(models.Model):
    # id int primary_key auto_increment
    id = models.AutoField(primary_key=True)
    
    # username varchar(32)
    username = models.CharField(max_length=32)
    
    # password int
    password = models.CharField()

*************************# 2 数据库迁移命令*************************
python manage.py makemigrations 
# 将操作记录记录到小本本上(migrations文件夹)

python manage.py migrate  # 将操作真正的同步到数据库中
# 只要你修改了models.py中跟数据库相关的代码 就必须重新执行上述的两条命令
******************************************************************

class User(models.Model):
    # id int primary_key auto_increment
    id = models.AutoField(primary_key=True,verbose_name='主键')
    # username varchar(32)
    username = models.CharField(max_length=32,verbose_name='用户名')
    """
    CharField必须要指定max_length参数 不指定会直接报错
    verbose_name该参数是所有字段都有的 就是用来对字段的解释
    """
    # password int
    password = models.CharField(verbose_name='密码')


class Author(models.Model):
    # 由于一张表中必须要有一个主键字段 并且一般情况下都叫id字段
    # 所以orm当你不定义主键字段的时候 orm会自动帮你创建一个名为id主键字段
    # 也就意味着 后续我们在创建模型表的时候如果主键字段名没有额外的叫法 那么主键字段可以省略不写
    # username varchar(32)
    username = models.CharField(max_length=32)
    # password int
    password = models.CharField()

1. 字段的增删改查

# 字段的增加
  1.可以在终端内直接给出默认值
  2.该字段可以为空
    info = models.CharField(max_length=32,verbose_name='个人简介',null=True)
  3.直接给字段设置默认值
    hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')

# 字段的删(不建议)
	# 直接注释对应的字段然后执行数据库迁移的两条命令即可!
  	# 执行完毕之后字段对应的数据也都没有了
"""
在操作models.py的时候一定要细心
	千万不要注释一些字段
	执行迁移命令之前最好先检查一下自己写的代码
"""

# 字段的修改
	# 直接修改代码然后执行数据库迁移的两条命令即可!
    
# 字段的查
	# 直接看代码就行

2. 数据的增删改查

# 增
from app01 import models
1. 方式1:creaate()
	res = models.User.objects.create(username=username,password=password)
	# 返回值就是当前被创建的数据对象本身

2. 方式2:对象.save()
	# 生成一个类对象
	user_obj = models.User(username=username,password=password)
    # 对象调用save方法
	user_obj.save()  
    
    
# 删
models.User.objects.filter(id=delete_id).delete()  # 批量删除
    
 
# 改(根据id 修改数据库中的数据)
password = request.POST.get('password')
username = request.POST.get('username')

1. 方式1
models.User.objects.filter(id=edit_id).update(username=username,password=password)
"""
        将filter查询出来的列表中所有的对象全部更新            批量更新操作
        只修改被修改的字段
    """

2. 方式2
edit_obj = models.User.objects.filter(id=user_id).first()
edit_obj.username = username
edit_obj.password = password
edit_obj.save()
"""
        上述方法当字段特别多的时候效率会非常的低
        从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改
    """


# 查
1. 查指定数据:filter()
	res = models.User.objects.filter(username=username)
	user_obj = models.User.objects.filter(username=username).first()
    """
    返回值你先看成是列表套数据对象的格式
    它也支持索引取值 切片操作 但是不支持负数索引
    它也不推荐你使用索引的方式取值
    filter括号内可以携带多个参数 参数与参数之间默认是and关系
    """

2. 查所有数据
	# 方式1
        data = models.User.objects.filter()
        print(data)
        # <QuerySet [<User: User object>, <User: User object>, <User: User object>, <User: User object>]>
	# 方式2
    	user_queryset = models.User.objects.all()
    	# <QuerySet [<User: User object>, <User: User object>, <User: User object>, <User: User object>]>
    	# return render(request,'userlist.html',{'user_queryset':user_queryset})
    	return render(request, 'userlist.html', locals())
		# locals() 函数可以把当前作用域中的变量传给前端

3. orm创建表关系

'''
表与表之间的关系
	一对多
	
	多对一
	
	一对一
'''
from django.db import models


# 创建表关系 先将基表创建出来 然后再添加外键字段
class Book(models.Model):
	title = models.CharField(max_length=32)
	price = models.DecimalField(max_digits=8,decimal_places=2)  # 小数总共八位,小数点后面占俩位
	'''
	外键关系:
		图书和出版社是一对多,并且书是多的一方,所以外键字段放在书表里面	
	'''
	publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
	# 在定义 ForeignKey 和 OneToOneField 字段时,应明确指定 on_delete 参数
	'''
	如果字段对应的是ForeignKey,那么会自动在字段的后面加id,如publish_id;
	如果自作聪明的加了_id,那么orm还是会给我们加_id
	'''

	# 图书和作者是多对多的关系,外键字段建在任意一方即可,但是推荐你建在查询频率较高的一方 
	# authors是虚拟字段,主要是告诉orm 书籍表和作者表是多对多的关系,让orm自动帮你创建第三张关系表
	authors = models.ManyToManyField(to='Author')


class Publish(models.Model):
	name = models.CharField(max_length=32)
	addr = models.CharField(max_length=32)

    
class Author(models.Model):
	name = models.CharField(max_length=32)
	age = models.IntegerField()
	'''
	作者与作者详情是一对一的关系,外键字段建在任意一方都可以,但是推荐你建立在查询频率较高的一方
	'''
	author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)


class AuthorDetail(models.Model):
	phone = models.BigIntegerField()
	addr = models.CharField(max_length=32)


十、Django 请求生命周期流程图

在这里插入图片描述

# 扩展知识点(了解即可)
"""
	缓存数据库
		提前已经将你想要的数据准备好了 你来直接拿就可以
		提高效率和响应时间
		
	当你在修改你的数据的时候 你会发现数据并不是立刻修改完成的
	而是需要经过一段时间才会修改
"""
  • 15
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值