外键。
关联关系model
CASCADE 级联删除set_null
on_delete
django与mysql版本不兼容问题
# setting 中开头导入这两句话
from django.db.backends.mysql.base import DatabaseWrapper
DatabaseWrapper.data_types['DateTimeField'] = "DateTime"
新建项目setting设置
TEMPLATES = [
'DIRS': [os.path.join(BASE_DIR,'templates')]
]
INSTALLED_APPS-----中挂载APP
DATABASES ----增加数据库信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day4',# 数据库名字
'HOST': 'localhost',# 主机名
'PORT': 3306,# 端口号
'USER': 'root',# 用户名
'PASSWORD': 'root',# 密码
}
}
新建APP指令
# 控制台:Terminal中输入
python manage.py startapp app名字(模块的名字)
# 完成后要在setting中挂载
model模型写完
python manage.py makemigrations 生成迁移文件
python manage.py migrate 执行
新建的test模块
# 首先要导入一个包
import os, django
# 自己manage.py文件中的第六行代码(导入setting)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_day4.settings')
django.setup()
# 必须放在所有代码开头,不然报错
查询的一些方法
all()------得到的是所有的QuerySet对象
all().value()-----得到表中的所有数据
value括号中可以写需要获取的值
get()------得到的是object 对象
可以通过对象.方法.属性得到数据
form表单中要加
{%csrf_token%}
form表单get、post
post的提交方式不会在url中显示参数;
可以通过request.POST.get方式来获取提交的数据。
get提交的参数会在url中显示;
可以通过request.GET.get的方法来获取提交的参数。
# 方法get()
根据键获取值,只能获取键的一个值
如果一个键同时拥有多个值,获取最后一值(因为覆盖了哦!)
# 方法getlist()------多选框
根据键获取值将键的值以列表返回
可以获取一个键的多个值
# 请求方式总结
1. get从服务器获取数据,不会更改服务器的状态和数据,在url中携带参数发给服务器
2. post则是将一定量的数据发送给服务器,一般会更改服务器的数据
3. post方法的参数不能再url中看到,他是通过body参数传递给服务器,相对于get方法,更加安全,
事务管理
1. with transaction.atomic():
· with中的代码回滚
2. # 给当前项目中所有的视图都添加了事务控制
# 'ATOMIC_REQUESTS': True
setting中database中加入
session在setting中的设置
# 修改session默认的有效期为一次会话SESSION_EXPIRE_AT_BROWSER_CLOSE = True
APP中新建的urls.py文件
path('home/', include('home.urls')),
urlpatterns = [
path('index/', views.index),
]
模板设置
TEMPLATES = [# 指定查找html文件的默认位置'DIRS'='']
a禁止跳转
<a href="javascript:void(0)" onclick="">删除</a># 禁止跳转
明显注释
#TODO
从头开始流程步骤
1. setting
os.path.join()
2. model
class User(models.Model):
username = models.CharField()
class Meta:
db_table = 'bz_user'
3.
上传时涉及文件
1. form表单必须指定enctype属性,
enctype = 'multipart/form-data',否则,FILES将为一个空的类似于字典的对象。
<form method="post" action="" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="file"><br>
<input type="submit" value="上传">
</form>
2. models需要指定文件上传
字段属性FileFiled或ImageField
指定upload-to属性,上传到哪
3. views视图中
要用 request.FILES.get()接收
4. 图片上传的位置上(setting设置):
# 1
该方法是在项目的主目录下新建media文件夹,models.py中会指定
sculpture = models.ImageField(upload_to="pics")
最终图片会存储到media>pics中
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# 2
如果在主目录下创建static>media.
则setting中设置:
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media')
5. 数据库中存的是相对路径
6. 存的同名的图片时(对文件进行重命名):
使用uuid
static
项目的静态资源
media
用户上传的静态资源
分页步骤、属性、方法、实现
paginator
# 分页器属性
1. count
2. num_pages
3. page_range
# 分页器方法
1. page()~~~
### 上传的头像前端展示(图片回显)
~~~markdown
1. 图片放在主目录下的media>pics 中
2. django寻找静态资源
setting中设置:
1. # 配置用户上传文件|图片的实际储存位置
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
2. # 将MEDIA_ROOT设置为Django静态资源查找目录
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
MEDIA_ROOT,
]
3. html页面展示的两种方法:
1. <td><img src="/static/{{ user.sculpture }}" alt="无法加载" width="50px" height="30px"></td>
2.加一个static标签(加载静态资源目录)
{% load static %}
<td><img src="{% static user.sculpture.url %}" alt="无法加载" width="50px" height="30px"></td>
分页实现
后台管理setting设置编码时区
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
# 改成:
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
admin后台管理
# 访问网址
127.0.0.1:8080/admin
# 用户名、密码、邮箱
运行命令
python manage.py createsuperuser
按提示输入用户名、邮箱、密码(小提示:密码最少8位,不能是纯数字/字符)
# 向admin中注册模型
在app里面有个admin.py的文件,在这个文件中注册需要在后台管理页面显示的模型。如果不注册则不会显示
admin.site.register(Department)
admin.site.register(Student)
# 1.列表页属性:
list_display:显示字段,可以点击列头进行排序;
list_filter:过滤字段,过滤框会出现在右侧;
search_fields:搜索字段,搜索框会出现在上侧;
list_per_page:分页,分页框会出现在下侧。
# 添加、修改页属性:
fields:属性的先后顺序
fieldsets:属性分组
# 如何修改后台管理系统的字段显示名?
通过对对应的模型类中对应字段设置verbose_name="指定要显示的字段名"实现!
中间件方法
1. process_request(self,request) :
执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
2. process_view(self, request, callback, callback_args, callback_kwargs):
调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
3. process_template_response(self,request,response):
在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象
4. process_exception(self, request, exception)
当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
5. process_response(self, request, response)
所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
# 激活中间件
MIDDLEWARE = [
'uploadapp.mymiddleware.MyMiddleware',
app名字 中间件名字
]
设置获取和删除cookies
# 在谷歌浏览器上,登录了CSDN之后,查看网址左边的那个锁,就可以看到CSDN在你本地浏览器中存储的cookie信息!
#
response = HttpResponse('设置cookie')
response.set_cookie('name', 'xiaoming ') # 默认关闭浏览器则过期
response.set_cookie('name', 'xiaoming', max_age=100) # 100s后过期
return response
# 或者
username = request.POST.get('username')
response = redirect('user:index')
response.set_cookie('username', username, max_age=60 * 5)
return response
# 删除cookies
def delete(request):
rs = HttpResponse('删除cookie')
rs.delete_cookie('name')
return rs
# 注意
设置cookie值以及删除cookie值都是response对象的操作,而获取cookie是从requeset相应中获得的。
虽然cookie可以保存状态但注意不要存储敏感信息(密码)。
session之状态保持
# 引言
1. cookie的键和值都是明文的形式存储在客户端浏览器上,很不安全!
2. 存储方式包括cookie,session,会话一般指session对象。
3. 使用cookie,所有数据存储在客户端,注意不要存储敏感信息。
4. 使用session方式,所有数据存储在服务器端(以键值对形式存储),在客户端cookie中存储 session_id,用户的重要信息是不会存储在客户端的,下次用户登录只需校验session_id即可,安全!!!
5. 状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据。
注意:不同的请求者之间不会共享这个数据,与请求者一一对应。
# session 依赖于cookie
cookie本身最大支持4096字节。保存在客户端,会被拦截或窃取。
# session特点
1. session是以键值对进行存储的
2. session依赖于cookie,唯一标识码sessionid 保存在cookie中
3. session也有过期时间~~~
~~~markdown
# 使用
使用session之前需要先执行makemigrations,migrate的模型映射文件命令,在数据库中有生成django_session的表
# setting中设置
1. app挂载
2. session中间件
# 数据库字段
1. session_key(就是上面所说的session_id);
2. session_data(就是对应的用户的隐私数据);
3. expire_date(就是session的过期时间)
# session简单操作
启用会话后,每个HttpRequest对象将具有一个session属性,它是一个既可读又可写的类似于字典的对象,表示当前的会话。
1. get(key, default=None):根据键获取会话的值
2. flush():删除当前的会话数据并删除会话的Cookie
# 设置session
request.session["name"] = "xiaoming"
request.session.set_expiry(100) #设置过期时间,单位为秒。到时间则自动删 除。 (比如你网页登录12306,多久时间内再次登录可不用重新登录!)
# 对session的访问,只能在服务端获取!
name = request.session.get("name","未登录") #第二个参数为默认值。如果获取的键不存在则显示默认值。
print(name)
# 对session的删除 (比如网页中登录12306之后,你退出!)
request.session.flush()清除session所有数据,清除表中的数据及cookie中的sessionid
request.session.clear()清除了session_date中的键值对,但session表中的记录还在
del request.session[key]删除指定的session中的某一个键值
return HttpResponse("完成!")~~~
### model模型
https://www.cnblogs.com/suraer/p/8515416.html
### 使用admin管理表单时admin.py添加
admin.site.register(models.User)
### path路径问题
~~~markdown
、
re_path(r'^$', views.index,name='index'),
path('',views.index,name='index'),
两个一个意思