django基础
1.创建了app要去INSTALLED_APPS这个里面加载
2.命令行创建的django项目,TEMPLATES,,里面没用加入
'DIRS': [os.path.join(BASE_DIR, 'templates')],要手动加入
pycharm,,在创建项目的时候,在more settings 里面可以创建一个app并且,app的配置是自动加入的
启动项目要么用命令的方式去启动,或者点绿色小箭头
如果绿色小箭头变灰了点即那个倒三角,进去吧项目加进去,这个里面也可以改端口
创建app可以在命令行创建,用命令,还可以用tools下面的 Run magage.py...,这个有自动提示
django三板斧
-HttpResponse
返回字符串
-render
return render(request, 'my_first.html') # 自动去templates下面找html
返回html文件
-redirect
重定向
return redirect('https://www.mzitu.com/')
静态文件配置
我们将html文件默认放在templates下
我们将网站使用的静态文件(前端写好的框架, bootstrp, jQuery, 图片,)放在static文件夹下
如果你的静态资源比如框架这些东西不是从cdn导入的,是从本机文件导入的,
你需要去做一个静态资源配置,在html手动导入你计算机的资源,记住不要去cdn导入
# 静态文件配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
在浏览器中输入url能看到对应的资源,是因为后端提前开设了该资源的接口
如果访问不到资源,说明后端没用开设该资源的接口
当你在写一个django项目的时候,可能回出现后端代码修改了,但是前端页面没有修改的情况
1.你在用同一个端口开了好几个django项目
2.浏览器缓存
静态文件动态解析: 令牌可以动态修改
{% load static %}
<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>
request
form表单的action参数
不写默认朝当前所在的url提交数据
全写,指名道姓
只写后缀
在前期,我们用django提交post请求,碰到403页面 # 'django.middleware.csrf.CsrfViewMiddleware',这行注掉
def login(request):
"""
get请求和post请求的处理机制不一样
:param request: 请求相关的数据对象
:return:
"""
# 给前端返回一个登录页面
# print(request.method) # 返回请求方式,全大写的字符串形式
# if request.method == 'GET':
# print('get 请求')
# return render(request, 'login.html')
# elif request.method == 'POST':
# return HttpResponse('post请求')
if request.method == 'POST':
print(request.POST) # 获取用户提交的post请求数据不包含文件
# <QueryDict: {'username': ['qwe'], 'password': ['1'], 'hobby': ['111', '222', '333']}>
username = request.POST.get('username')
# hobby = request.POST.get('hobby')
"""
get只能获取到列表的最后一个元素
getlist拿到整个列表
获取url后面携带的参数,
print(request.GET) # 获取用户提交的get数据
用法和get一样
"""
hobby = request.POST.getlist('hobby')
return HttpResponse('post 请求')
return render(request, 'login.html')
数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'first_django',
'USER': 'root',
'PASSWORD': '5201314a',
'HOST': '127.0.0.1',
'PORT': 3306,
'CHARSET': 'utf8'
}
}
django默认用的是mysqldb模块连接mysql
该模块兼容性不好,,手动改为pymysql
项目名下的__init__.py或者任意的应用文件下的__init__.py 文件中书写代码
Django ORM
ORM 对象关系映射
将类映射成一张表,对象就是一条记录,,对象属性,记录莫格字段对应的值
自己创建的表,我们利用orm创建的表,auth和django开头的都是django默认创建的
我们的表名是你当前models所在的app文件下环线一个你的类名
只要修改了models.py中跟数据库相关的代码,必须执行数据库迁移命令
# 数据库迁移命令
# python3 manage.py makemigrations 记录操作
# python3 manage.py migrate 将操作同步到数据库
利用orm实现字段的增删改查
1.当表中已有数据的时候,可以在终端给出默认值
2.增加数据的时候,当表中已有数据,你可以允许为空,也可以指定默认值
3.修改直接修改字段的代码,执行数据库迁移命令
4.对应的字段注释掉,执行数据库迁移(不要轻易操作)
数据的增删改查
查:
res = models.User.objects.filter(username=username).first()
filter()括号内可以跟多个参数,连接是默认and连接
增:
(1)
res = models.User.objects.create(username=username, password=password)
这个返回值是当前创建的对象
(2)
user_obj = models.User(username=username, password=password)
user_obj.save()
/edit_user/?user_id = {{ user_obj.id }}
这样可以拿到点击的主键值,,?后面的不参与路径匹配
return render(request, 'user_list.html', locals()) # locals()默认把当前页面的名称空间全部传到html页面
# 修改数据库
# 方式一:
models.User.objects.filter(id=edit_id).update(username=username, password=password)
# 只修改被修改的字段
# 将filter查询出来的所有数据全部更新,是一个批量更新
# 方式二:
edit_obj.username = username
edit_obj.password = password
edit_obj.save()
# 这个方法当字段特别多的时候效率特别低
models.User.objects.filter(id=delete_id).delets()
# 批量删除
真正的删除功能应该有一个二次确认,删除数据内部其实并不是真正的删除,我们会给数据添加一个标识字段用来表示当前数据是否被删了
orm如何创建表关系
表与表之间的关系
一对一
多对多
多对一
判断表关系的方法,换位思考
例如:
"""
图书表
出版社表
作者表
作者详细表
作者和图书关系表
图书和出版社是一对多的关系,,外键建在多的一方
书和作者是多对多的关系,所以要创建一张关系表
作者与作者详情表是一对一的
"""
from django.db import models
# Create your models here.
# 创建表关系 先将基表创建出来 然后添加外键字段
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2)
# 小数总共八位,小数点后面2为
"""
图书和出版社是一对多,并且书是多的一方,外键字段放在书表
"""
publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE) # 默认就是与出版社表的主键字段做关联
"""
如果字段对应的是ForeignKey,那么orm会自动在字段后面加_id,如果你加了_id,orm后面换回加_id
图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
"""
authors = models.ManyToManyField(to='Author')
"""
authors是一个虚拟字段,主要是用来告诉orm,书记表和作者表是多对多的关系
让orm创建第三张关系表
"""
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)
"""
OneToOneField也会自动加后缀
"""
class AuthorDetail(models.Model):
phone= models.BigIntegerField()
addr = models.CharField(max_length=32)
"""
orm如何定义三种关系:
publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
authors = models.ManyToManyField(to='Author')
author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)
多对多的表关系可以有好几种创建方式
"""
django请求周期流程图
F:\python上海老男孩培训--自己笔记\django