外键。
关联关系model
CASCADE 级联删除set_null
on_delete
django与mysql版本不兼容问题
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指令
python manage.py startapp app名字(模块的名字)
model模型写完
python manage.py makemigrations 生成迁移文件
python manage.py migrate 执行
新建的test模块
import os, django
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.
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()
上传的头像前端展示(图片回显)
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'
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# 删除cookiesdef 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也有过期时间
# 使用使用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路径问题
re_path(r'^$', views.index,name='index'),path('',views.index,name='index'),两个一个意思
|