Dayday up ---- python Day19
回顾django基础
django 请求生命周期
---> url对应关系(匹配) ---> 视图 函数 ---> 返回用户字符串
---> url对应关系(匹配) ---> 视图 函数 ---> 打开一个html文件
创建 django project
django-admin startproject mysite
cd mysite
python manage.py startapp cmdb 创建app
配置
模板路径
静态文件路径
注释全站伪造 # csrf
编写程序
a、 url.py
^index/ ----> func
b、 views.py
def func(request):
# 包含所有的请求数据
....
return HttpResponse('字符串')
return render(request,'index.html',{''})
return redirect('URL')
c、 模板语言
return render(request, ‘index.html’, {‘li’: [11,22,33]})
{% for item in li %}
<h1>{{item}}</h1>
{%endfor%}
****索引用点.****
<h2>{{item.0}}</h2>
Django
后台获取数据
单个数据: request.POST.get 比如:input (text,radio,password)
多个数据: request.POST.getlist 比如: input(checkbox)
上传文件: request.POST.get 只能获取文件名
request.FILES.get 获取文件

FBV & CBV
FBV: function base view
CBV: class base view
基于反射查找
请求 ---> dispatch ---> get/post ---> dispatch ---> 用户
CBV 实例:



模板语言:
字典:
urls.py
from django.views import View class Detail(View): def get(self,request): USER_LIST = { 'k1': 'root1', 'k2': 'root2', 'k3': 'root3', 'k4': 'root4', } print(request.method) return render(request, 'detail.html', {'USER_LIST': USER_LIST})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> {{ USER_LIST.k1 }} <ul> {% for k in USER_LIST.keys %} <li>{{ k }}</li> {% endfor %} </ul> <ul> {% for v in USER_LIST.values %} <li>{{ v }}</li> {% endfor %} </ul> <ul> {% for k,v in USER_LIST.items %} <li>{{ k }}-{{ v }}</li> {% endfor %} </ul> </div> </body> </html>
路由系统
1、单一路由对应:
url(r'^index$',view.index)
url:/index
2、基于正则的路由
url(r'^index/(\d*)',view,.index)
url: /index/123
函数得添加参数

实例:

USER_LIST = { 'k1': 'root1', 'k2': 'root2', 'k3': 'root3', 'k4': 'root4', } class user_info(View): def get(self,request): return render(request,'user_info.html',{'USER_LIST' : USER_LIST}) class Detail(View): def get(self,request,uid,nid): # def get(self, request, uid, nid): detail_info = USER_LIST[uid] print(request.method) return render(request, 'detail.html', {'detail_info': detail_info})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> {% for k,v in USER_LIST.items %} <p><a href="detail-{{ k }}-{{ v }}.html">{{ k }}</a></p> {% endfor %} </div> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <ul> <li>{{ detail_info }}</li> </ul> </div> </body> </html>
总结:
url 路由正则
1、url(r'^index/', views.index), url(r'^home/',views.Home.as_view()),
2、url(r'^detail-(\d+).html', views.detail),
3、url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
函数参数可以使用 *args **kwargs
如:


3、为路由映射设置名称
name: 对url路由的关系进行命名 以后可以根据此名称生成自己想要的url 
随意填的数据分别对应url里面的参数
设置名称之后,可以在不同的地方调用,如:
-
- 模板中使用生成URL {% url 'h2' 2012 %}
- 函数中使用生成URL reverse('h2', args=(2012,)) 路径:django.urls.reverse
- Model中使用获取URL 自定义get_absolute_url() 方法
获取请求匹配成功的URL信息:request.resolver_match
4、urls分发
一级路由:
from django.conf.urls import url,include
url(r'^hosts_info', include("hosts_info.urls")),
二级路由:
from django.conf.urls import url,include
from django.contrib import admin
from hosts_info import views
urlpatterns = [
url(r'^login/',views.login)
]
Django orm数据库操作
程序数据库操作分为两种:
db_first 直接在数据库里操作
code_first 先创建代码 执行之后创建操作 *** 推荐
ORM
1、根据类自动创建数据库表
# app下的 models.py
2、根据类对数据库表中的数据进行各种操作
django默认数据库是db.sqlite3 如果想支持mysql 默认使用MySQLdb模块,而python3还没有,现在可以使用pymysql
配置:
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dbname',
'USER': 'usernmae',
'PASSWORD': 'pwd',
'HOST': 'ip',
'PORT': 'port',
}
}
# 如下设置放置的与project同名的配置的 __init__.py文件中 import pymysql
pymysql.install_as_MySQLdb() 使用四部曲:
1、在app 下的models.py 写类,即表结构
默认的数据库生成表名称为: app名称_类名
如果想自定义表名:
在Userinfo中,加上函数 Meta
db_table = "table_name"

2、注册app,在settings.py 中 INSTALLED_APPS 添加app名字

3、在console 执行 python manage.py makemigrations
4、在console 执行 python manage.py migrate
创建表数据

查询表数据

删除表数据

修改表数据

判断数据库是否存在某数据

orm 创建表自动添加id列,并且自增, 如果想自己设置是否自增
id = models.AutoField(primary_key=True)
字段:
1、models.AutoField 自增列 = int(11)
如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField 字符串字段
必须 max_length 参数
3、models.BooleanField 布尔类型=tinyint(1)
不能为空,Blank=True
4、models.ComaSeparatedIntegerField 用逗号分割的数字=varchar
继承CharField,所以必须 max_lenght 参数
5、models.DateField 日期类型 date
对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField 日期类型 datetime
同DateField的参数
7、models.Decimal 十进制小数类型 = decimal
必须指定整数位max_digits和小数位decimal_places
8、models.EmailField 字符串类型(正则表达式邮箱) =varchar
对字符串进行正则表达式
9、models.FloatField 浮点类型 = double
10、models.IntegerField 整形
11、models.BigIntegerField 长整形
integer_field_ranges = {
'SmallIntegerField': (-32768, 32767),
'IntegerField': (-2147483648, 2147483647),
'BigIntegerField': (-9223372036854775808, 9223372036854775807),
'PositiveSmallIntegerField': (0, 32767),
'PositiveIntegerField': (0, 2147483647),
}
12、models.IPAddressField 字符串类型(ip4正则表达式)
13、models.GenericIPAddressField 字符串类型(ip4和ip6是可选的)
参数protocol可以是:both、ipv4、ipv6
验证时,会根据设置报错
14、models.NullBooleanField 允许为空的布尔类型
15、models.PositiveIntegerFiel 正Integer
16、models.PositiveSmallIntegerField 正smallInteger
17、models.SlugField 减号、下划线、字母、数字
18、models.SmallIntegerField 数字
数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField 字符串=longtext
20、models.TimeField 时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField 字符串,地址正则表达式
22、models.BinaryField 二进制
23、models.ImageField 图片
24、models.FilePathField 文件
字段参数:
null -> db是否可以为空
default -> 默认值
primary_key -> 主键
db_column -> 列名
db_index -> 索引
unique -> 唯一索引
unique_for_date ->
unique_for_month
unique_for_year
auto_now -> 创建时,自动生成时间
auto_now_add -> 更新时,自动更新为当前时间
# obj = UserGroup.objects.filter(id=1).update(caption='CEO')
# obj = UserGroup.objects.filter(id=1).first()
# obj.caption = "CEO"
# obj.save()
choices -> django admin中显示下拉框,避免连表查询
blank -> django admin是否可以为空
verbose_name -> django admin显示字段中文
editable -> django admin是否可以被编辑
error_messages -> 错误信息欠
help_text -> django admin提示
validators -> django form ,自定义错误信息
创建外键:
user_group = models.ForeingnKey("UserGroup",to_field='uid',default=1)
创建外键数据:
models.UserInfo.objects.create(
username='root1',
password='123',
email='aaaa@163.com',
user_group_id = 1
# 或者 user_group = models.UserGroup.objects.filter(id=1).first()
user_group 是一个对象
)
一对多:
当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)

浙公网安备 33010602011771号