- Django(二)
- 静态文件
- 静态文件配置及访问顺序
- 动态解析
- request对象方法
- request方法
- Django连接MySQL
- Django ORM
- ORM实操之数据库迁移
- ORM实操之字段的修改
- ORM实操之数据的增删改查
Django(二)
静态文件
什么是静态文件?
- 静态文件:写好的文件不会动态改变的文件资源,比如CSS文件,Js文件,图片文件,第三方框架等·····
- 墨守成规的将这些文件放在自创
static文件夹
中,在静态文件夹中创建CSS
、JS
、img
、others
文件夹·····
配置静态文件,拿第三方框架bootstrap来举例,如果用到静态文件,需要在
settings.py
配置,配置好bootstrap的绝对路径只从写根目录写起就ok啦!再需要写静态文件,在
static
中写就了!
'''settings.py'''
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
示例:登录
'''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),
]
'''views.py'''
from django.shortcuts import render
# Create your views here.
def login(request):
return render(request,'login.html')
Title
用户登录
ps:配置静态文件完成后,那么在static
文件下的文件都可以通过路径来访问到,eg:127.0.0.1:8000/static/a.txt
ps:如果Django主页面不能访问了,在urls.py文件中写一个默认的对应关系补充
静态文件配置及访问顺序
静态文件
STATIC_URL = '/static/' # 接口前缀,不是文件名,类似"令牌"
'''
如果你想要访问静态文件资源必须以static开头,如果写了接口前缀之后,下面的静态配置文件下的文件都能够访问
'''
# 静态文件配置,可以写多个,访问的顺序是从上往下依次查找
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2'),
]
动态解析
涉及到接口前缀的修改繁琐的问题,那么现在使用动态解析的语法来实现,修改了接口前缀也能够动态解析,从而不需要挨个文件的修改!
{% load static%}
request对象方法
提交表单出现403错误,如何解决?
settings.py
文件注释掉'django.middleware.csrf.CsrfViewMiddleware',
就可以了
request方法
- request.method:获取当前请求方法
- request.body:以二进制的形式返回用户提交的数据
- request.POST:以字典的形式返回用户提交的数据
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def login(request):
print(request.method, type(request.method)) # GET
if request.method=='POST':
return HttpResponse('POST请求返回结果!')
return render(request,'login.html') # GET请求返回页面
注意:request.POST
返回的字典用get方法获取列表形式的value,返回的是字符串,get方法只会取列表的最后一个元素
# 在获取用户多选或者提交的信息是多条,返回在一个列表内如何获取用户数据呢?
使用request.POST.getlist方法,返回一个列表,就不再使用get方法了
def login(request):
print(request.method, type(request.method)) # GET
print( request.POST)
print( request.POST.get('Email'))
print( request.POST.getlist('Email'))
if request.method=='POST':
return HttpResponse('POST请求返回结果!')
return render(request,'login.html') # GET请求返回页面
GET请求方式的方法是一样的
如何获取URL?
后面的参数?
request.GET
方法:和request.POST方法是一样的,返回字典
request.GET.get(k)
:获取字典的value,返回字符串
request.GET.getlist(k)
:获取用户数据,获取到整个列表
文件对象如何获取??
针对表单提交的文件对象,如何获取?这里不能使用request.POST或者request.GET方法,使用
request.FILES
方法,返回结果看成字典即可
- 获取表单提交文件对象的方法:
request.FILES
方法有了,返回的是空字典,在表单中添加
enctype
参数,再提交就可以获取到文件对象
Django连接MySQL
Django默认使用的数据库是
sqlite3
,这里介绍如何使用Django连接MySQL数据库
1、修改配置文件
# 默认的情况settings.py文件
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# 修改配置文件
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库',
'HOST':'ip地址',
'PORT':3306,
'USER':'用户名',
'PASSWORD':'密码',
'CHARSET':'utf8'
}
}
# 数据库使用是提前创好的!!!
2、在项目文件夹或应用文件夹中的__init__.py
文件书写固定的代码
'''__init__.py'''
import pymysql
pymysql.install_as_MySQLdb()
如果报错: query = query.decode(errors='replace') AttributeError: 'str' object has no attribute 'decode'
解决办法:query = query.decode(errors='replace')
提换成query = errors = 'replace'
Django ORM
ORM:对象映射关系程序
通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言;
python与MySQL映射关系
Python | 映射 | MySQL |
---|---|---|
类 | -------> | 表 |
对象 | -------> | 表里面的数据 |
对象点属性 | -------> | 字段对应的值 |
ORM实操之数据库迁移
✨我们的模型类需要写在应用下的models.py文件中
# SQL原生语句和ROM创建的区别
class User(models.Model):
# id int primary key auto_increment
id = models.AutoField(primary_key=True)
# name varchar(32)
name = models.CharField(max_length=32) # CharField必须要加max_length参数
# age int
age = models.IntegerField()
✨✨✨数据库迁移命令(重点)
- 只要修改了
models.py
文件执行了和数据库相关的命令,就重新执行下面这两条命令:python3 manage.py makemigrations、python3 manage.py migrate - 或者打开Tools,点击
RUN manage.py Task
,输入makemigrations
1.将数据库修改操作先记录到"本本"(对应应用下的migrations文件夹)
python3 manage.py makemigrations
# 执行完,产生一个文件,用来记录
2.真正的执行数据库迁移操作,同步到数据库
python3 manage.py migrate
# 执行完会在数据库中产生Django所需的依赖表,自动创建的
# 自己创建的表user以'应用名_表名'的形式创建,app01_user
✨✨不指定id字段和主键等,ORM会自动创建id
# 如果你不指定主键 那么orm会自动帮你创建一个名为id的主键字段
class user(models.Model):
username = models.CharField(max_length=32)
# 就不用写id了···,需要定制id,就写上~
ORM实操之字段的修改
# 原来的表
class user(models.Model):
username = models.CharField(max_length=32)
# 增加字段(两种方法)
password = models.IntegerField('密码',null=True) # 该字段可以为空
is_delete = models.IntegerField(default=0) # 默认值
# 修改字段
直接改代码,然后执行makemigrations,数据库迁移
# 删除
直接删除或者注释掉代码,然后执行makemigrations,数据库迁移
ORM实操之数据的增删改查
# 1.查询数据
# select * from user where name=username;
user_obj = models.User.objects.filter(name=username).first()
# 2.添加数据
# insert into user(name,pwd) values(username,password);
models.User.objects.create(name=username,pwd=password)
# 3.查询所有的数据
# select * from user;
models.User.objects.all() # [obj1,obj2,obj3,obj4]
# 4.修改数据
models.User.objects.filter(id=edit_id).update(name=username,pwd=password)
edit_obj.name = username
edit_obj.pwd = password
edit_obj.save()
# 5.删除数据
models.User.objects.filter(id=delete_id).delete()