标签:请求协议 -- 服务 code datetime hidden cookies expires wmi
后台登录地址:http://localhost:8000/admin
1、创建后台管理员
./manage.py createsuperuser
Username:
Email Address:
Password:
Password(again):
2、基本管理
1、在应用中的admin.py中注册要管理的数据
1、admin.py
作用:注册需要管理的Models,只有在此注册的Model才允许被管理,否则无法管理
2、注册Model
from .models import *
admin.site.register(Entry)
ex:
admin.site.register(Author)
3、修改 models.py 处理显示内容
后台默认效果可读性不高
在models.py中的各个 class 中追加
def __str__(self):
return self.name
4、通过内部类Meta实现展现的属性
允许为每个 model 类设置内部类 Meta 来设置起展现形式
class Author(models.Model):
.... ....
.... ....
.... ....
class Meta:
1、db_table : 指定该实体类对应到表的名称
2、verbose_name : 定义该实体类在 admin 中显示的名字(单数形式)
3、verbose_name_plural : 效果同上,是复数形式
4、ordering :在后台显示数据时的排序规则,取值为一个 列表,默认是按升序,降序的话则添加 '-'
3、高级管理
1、在 admin.py 中创建管理类,实现高级管理功能
1、定义 EntryAdmin 类,继承自 admin.ModelAdmin
class AuthorAdmin(admin.ModelAdmin):
pass
2、注册 高级管理类
admin.site.register(Entry,EntryAdmin)
admin.site.register(Author,AuthorAdmin)
3、允许在EntryAdmin增加的属性
1、list_display
作用:在显示实体信息的页面上,都显示哪些字段
取值:由属性名组成的元组或列表
ex:
list_display=('name','age','email')
2、list_display_links
作用:定义能够链接到具体实体页面的链接们
取值:由属性名组成的元组或列表
注意:取值要必须出现在 list_display 中
ex:
list_display_links=('name','email')
3、list_editable
作用:定义在列表页面中允许被修改的字段
取值:由属性名组成的元组或列表
注意:list_editable的值不能出现在list_display_links中
4、search_fields
作用:添加允许被搜索的字段
取值:由属性名组成的元组或列表
5、list_filter
作用:在列表的右侧增加过滤器,实现快速筛选
取值:由属性名组成的元组或列表
6、date_hierarchy
作用:在顶部增加一个时间选择器,所以取值必须是 DateField 或 DateTimeField 的列
7、fields
作用:在实体的详细页面中,显示哪些属性,并按照什么样的顺序显示
取值:由属性名组成的元组或列表
8、fieldsets
作用:在实体的详细页面中,对属性进行分组
注意:fieldsets 与 fields 不能共存
语法:
fieldsets=(
('分组名称',{'fields':(属性1,属性2),'classes':('collapse')}),
)
1、一对一映射(1:1)
1、什么是一对一
A表中的一条记录只能与B表中的一条记录匹配关联
典型代表:一夫一妻制
数据库中的实现:
A表:设计主键
B表:有主键,增加一列,并引用A表中的主键值,还得增加一个唯一约束
2、语法
属性 = models.OneToOneField(Entry)
3、查询
class Wife(models.Model):
.... ....
author = models.OneToOneField(Author)
正向查询:通过 wife 找 author
w = Wife.objects.get(id=1)
a = w.author
反向查询:通过 author 找 wife
a = Author.objects.get(id=1)
w = a.wife
wife 是由Django通过OneToOneField在Author中默认增加的一个属性
2、一对多映射(1:M)
1、什么是一对多
A表中的一条数据可以与B表中的任意多条数据匹配
比如 出版社 和 书籍 之间的关系
2、语法
使用 外键(Foreign Key)
属性 = models.ForeignKey(实体类)
ex:
Book(M) 和 Publisher(1)
class Book(models.Model):
... ...
publisher = models.ForeignKey(Publisher)
3、查询
Book(M) 和 Publisher(1)
class Book(models.Model):
... ...
publisher = models.ForeignKey(Publisher)
1、正向查询 - 通过 Book 查询 Publisher
book = Book.objects.get(id=1)
publisher = book.publisher
2、反向查询 - 通过 Publisher 查询 Book
publisher = Publisher.objects.get(id=1)
通过 publisher.book_set.all()得到所有的关联数据
bookSet = publisher.book_set.all()
1、多对多查询
1、什么是多对多
A表中的一条记录可以与B表中的任意多条记录匹配,同时B表中的每一条记录也可以与A表中的任意多条记录相匹配
2、语法
entry = models.ManyToManyField(Entry)
3、查询
class Author(models.Model):
... ...
publish = models.ManyToManyField(Publish)
正向查询:在 Author 中查询 Publish
author = Author.objects.get(id=3)
pub_list=author.publish.all()
通过关联属性.all()
反向查询:在 Publisher 中查询 Author
pub = Publisher.objects.get(id=1)
auList = pub.author_set.all()
1、声明类 EntryManager,继承自models.Manager,并添加自定义函数
class EntryManager(models.Manager):
def 函数名(self,自定以参数):
... ...
return ...
2、使用EntryManager 覆盖 Models中的objects
class Entry(models.Model):
objects = EntryManager()
1、什么是HttpRequest
HttpRequest,请求对象,封装了请求过程中的所有信息
在Django中,HttpRequest 被化身成了 request封装到视图处理函数中作为参数.该参数,在调用视图处理函数时自动传入
print(dir(request))
2、HttpRequest 中的主要内容
1、request.scheme : 请求协议
2、request.body 请求主体
3、request.path 请求路径
4、request.get_host() 请求的主机地址 / 域名
5、request.method 请求方法
6、request.GET get的请求数据
7、request.POST post的请求数据
8、request.COOKIES cookies的数据
9、request.META 请求的元数据
3、有关HTTP协议
1、每个请求一定会有 method
get,post,put,delete,... ...
get:向服务器要数据时使用
传递数据到服务器时会直接将请求数据封装到地址之后
http://www.baidu.com/s?wd=佳能&price=3000
post:想传递数据到服务器处理的时候,用post
post的请求提交的数据全部封装在 "请求主体" 中
2、请求主体
只有post 和 put 请求方式才能产生请求主体
其他请求方式都没有请求主体
4、获取请求提交的数据
1、GET请求
request.GET['名称']
2、POST请求
request.POST['名称']
目的:为了解决跨站点发送post请求
解决方案:
1、删除 CsrfViewMiddleWare 中间件
2、在视图函数增加@csrf_protect
3、
在模板中 <form> 底下第一行增加一个标签{%csrf_token%}
<form method="" action="">
{%csrf_token%}
</form>
1、forms 模块的作用
通过forms模块,允许将表单控件与py文件相结合
2、使用 forms 模块
1、创建 forms.py 文件
2、导入 forms
from django import forms
3、创建class,一个class对应一个表单
该 class 必须继承自 forms.Form
4、在class中创建属性
一个属性对应一个表单控件
3、在模板中,解析 form 对象
1、注意
1、需要自定义 <form>
2、需要自定义 提交按钮
2、处理方法
1、手动解析
{%for filed in form%}
<p>{{filed.label}}:{{field}}</p>
{%endfor%}
2、自动解析
{{form.as_p}}
{{form.as_ul}} - 需要自定义 ul
{{form.as_table}} - 需要自定义 table
4、在HTML中提交的表单内容也可以传递给forms.Form
views.py
def remark_views(request):
form = RemarkForm(request.POST)
if form.is_valid():#必须要经过验证才能继续
cd = form.cleaned_data #封装了提交的数据
print(cd['uname'])
5、forms 的高级处理
将 Models 和 Forms 结合到一起使用
通过Models 自动生成表单
1、创建 class ,EntryForm ,并继承自 forms.ModelForm
2、创建内部类 Meta ,并定义相关信息
1、model :指定关联的Models是谁
2、fields
1、指定一个列表,声明允许生成表单控件的属性
2、取值 "__all__",表示全部属性都允许被生成表单控件
3、labels - 字典
{
'属性1':'显示文本1',
'属性2':'显示文本2',
}
6、内置小部件(widgets)
1、什么是小部件
生成到网页上的控件的类型
2、常用小部件
1、TextInput : type="text"
2、NumberInput : type="number"
3、EmailInput : type="email"
4、URLInput : type="url"
5、PasswordInput : type="password"
6、HiddenInput : type="hidden"
7、CheckboxInput : type="checkbox"
8、Textarea : <textarea></textarea>
9、Select : <select></select>
3、小部件的使用
1、继承自 forms.Form
subject = forms.CharField(
label='标题',
widget=forms.TextInput(
attrs={
'属性名':'属性值',
'class':'form-control',
'placeholder':'请输入用户名'
}
)
)
2、继承自 forms.ModelForm
class WidgetForm(forms.ModelForm):
class Meta:
model = Users
fields = '__all__'
labels = {
'uname':'...'
}
widgets = {
'uname':forms.TextInput(attrs={
'class':'form-control',
'placeholder':'xxx'
})
}
1、cookies
1、什么是cookies
cookies是一种数据存储技术
将一段文本保存在客户端(浏览器)的一种技术。并可以长时间的保存
2、cookies的使用场合
1、保存登录信息
2、保存用户的搜索关键词
3、django 中使用 cookies
1、设置cookies(保存数据到客户端)
1、不使用模板
resp = HttpResponse("给客户端的一句话")
resp.set_cookie(key,value,expires)
return resp
key : cookie的名称
value : 保存的cookie的值
expires : 保存的时间,以 s 为单位
ex:
resp.set_cookie('uname','zsf',60*60*24*365)
2、使用模板
resp = render(request,'xxx.html',locals())
resp.set_cookie(key,value,expires)
return resp
3、重定向
resp = HttpResponseRedirect('/login/')
resp.set_cookie(key,value,expires)
return resp
2、获取cookies(从客户端获取数据)
request.COOKIES
1、什么是session
session(会话),实际上就是服务器为每个浏览器临时开辟的一段空间,用于保存 相关的请求信息
2、session的应用场合
session也是为了存放数据而存在的,通常会把服务器端要用到的数据保存进 session
3、Django中使用session
1、设置session的值
request.session['key']=值
request.session.set_expiry(time):设置过期时间,如果设置为0的话则表示浏览器关闭则失效
2、获取session的值
request.session.get('key')
3、删除 session 的值
del request.session['key']
4、settings.py 有关session的设置
1、SESSION_COOKIE_AGE = 60 * 30
2、SESSION_EXPIRE_AT_BROWSER_CLOSE = True
标签:请求协议 -- 服务 code datetime hidden cookies expires wmi
原文地址:https://www.cnblogs.com/-hjj/p/9942970.html