Python 学习第十九天 django知识
一,django 知识总结
1,同一个name属性的标签,多个值获取
<form action="/login/" method="POST" enctype="multipart/form-data">
<p>
<input type="text" name="user" placeholder="用户名" />
</p>
<p>
<input type="password" name="pwd" placeholder="密码" />
</p>
<p>
男:<input type="radio" name="gender" value="1"/>
女:<input type="radio" name="gender" value="2"/>
张扬:<input type="radio" name="gender" value="3"/>
</p>
<p>
男:<input type="checkbox" name="favor" value="11"/>
女:<input type="checkbox" name="favor" value="22"/>
张扬:<input type="checkbox" name="favor" value="33"/>
</p>
<from>
view.py函数
v = request.POST.getlist('favor')
2,select 标签多选
<p>
<select name="city" multiple> #select标签添加multiple属性
<option value="sh">上海</option>
<option value="bj">北京</option>
<option value="tj">天津</option>
</select>
</p>
3,文件上传
#form 表单中设置
<form action="/login/" method="POST" enctype="multipart/form-data">
view.py
obj = request.FILES.get('fafafa')
print(obj,type(obj),obj.name)
import os
file_path = os.path.join('upload', obj.name)
f = open(file_path, mode="wb")
for i in obj.chunks():
f.write(i)
f.close()
4,模板语言循环操作字典
view.py 中定义字典
USER_DICT = {
'k1': 'root1',
'k2': 'root2',
'k3': 'root3',
'k4': 'root4',
} tamplates 中的html模板中读取 {% for k,row in user_dict.items %}
<li>{{ k }}-{{ row }}</li>
{% endfor % }
5,tamplates 的html获取字典中的值
html
1,跳转html <li><a target="_blank" href="/detail-{{k}}.html”>{{ row.name }} </a></li>
2,跳转后的html
<h1> 详细信息</h1>
<h6>用户名:{{ detail_info.name }}</h6>
<h6>邮箱:{{ detail_info.email }}</h6> views.py函数
def detail(request,nid):
detail_info = USER_DICT[nid]
return render(request, 'detail.html', {'detail_info': detail_info})
url.py
url(r'^detail-(\d+).html', views.detail),
6,django url 正则匹配
(1)在django url 中传参数,发送给后端的views.py中的处理函数,有时候会遇到传多个参数的问题,例如 url(r'^detail-(\d+)-(\d+).html',views.detail), 在views.py函数中接收,def detail(request,nid,uid),函数定义中传入多个形式参数,来接收url的变量,且变量的值和detail函数的参数位置是一致的,
(2)在django url 中添加?P,确定url中参数对应的变量名,这样detail函数中定义的形式参数位置可以任意放置
url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html',views.detail) def detail(request,uid,nid)
def detail(request,nid,uid) #都可以自行接收自己的值
(3)wiews.y函数中接收多个参数 def detail(request,*args,**kwargs) *args是以元组的形式接收参数,**kwargs是以字典的形式接收参数
总结
a. url中单个正则表达式
url(r'^detail-(\d+)-(\d+).html', views.detail), def func(request, nid, uid):
pass
def func(request, *args):
args = (2,9)
def func(request, *args, **kwargs):
args = (2,9) b. url 中的正则表达式以key.value形式定义
url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
def func(request, nid, uid):
pass
def funct(request, **kwargs):
kwargs = {'nid': 1, 'uid': 3}
def func(request, *args, **kwargs):
args = (2,9)
7,django url 中的name属性,对URL路由关系进行命名
(1) 在url中可以为一个url设置一个别名 例如 ('r‘indexaaaabbbaa’,views.index,name="index")
(2) 在templates 的html中引用 <form action="{% url 'index' %}" method="POST"></form>
(3) <form action="{{ request.path_info }}" method="POST" ></form>提交完成之后跳转本页 ,path_info 获取当前url
(4) 在 wiews.py函数中重写url
from django.urls import reverse
def index(request):
v=reverse('indexx')
print(v) #v为生成的url,当url 中不含参数时例如url(r'index',index,name="indexx")
def index(request,nid):
v=reverse('indexx' args=(90,)) #当url 中含一个参数时例如url(r'index/(\d+)/',index,name="indexx")
def index(request,nid,vid):
v=reverse('indexx',args=(90,10,)) #当url 中含多个参数例如url(r'index/(\d+)/(\d+)/',index,name="indexx")
def index(request,nid,vid):
v=reverse('indexx',kwargs={'nid':1,'vid':10} #当url中含?P时例如url(r'index/(?P<nid>\d+)/(?P<uid>\d+)/',index,name="indexx")
#form 表单里面传值<form action="{% url 'index' nid=1 uid=3 %}" method="POST"></form>
(5)url分类,多个app url分发
在主程序django project 下的url 中添加app的url
url(r'^cmdb/',include("app01.urls")), #到app01中加载app01的urls文件
url(r'^monitor/',include("app02.urls")), #到app02中加载app02的urls文件
8,django ORM操作数据库
1,创建数据库
(1)创建类
from django.db import models
# app01_userinfo
class UserInfo(models.Model):
# id列,自增,主键
username = models.CharField(max_length=32) # id列,自增,主键
password = models.CharField(max_length=64) # 用户名列,字符串类型,指定长度
(2)注册APP
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
]
(3)执行命令
python manage.py makemigrations
python manage.py migrate
(4)注意
#Django默认使用MySQLdb模块链接MySQL
#主动修改为pymysql,在project同名文件夹下的__init__文件中添加如下代码即可:
#import pymysql
#pymysql.install_as_MySQLdb()
2,数据写入
方法一:
models.UserInfo.objects.create(username="root",password="123")
方法二:
dict = {'username':'eric','password':'123'}
models.UserInfo.objects.create(**dict)
方法三:
obj = models.UserInfo(username='jack',password='123')
obj.save()
3,数据查找
(1) 查取所有 result = models.UserInfo.objects.all()
result为QuerySet类型,为django的数据类型,可以看做一个列表,表当中有多少条数据,列表中就有多少个元素,每个元素其实就是一个obj对象,对象中包含 的内容就是表的每一个字段,例如[obj(id,username,password),obj(id,username,password),obj(id,username,password)],最终的读取可以用如下代码
for row in result:
print(row.id,row.username,row.password)
(2)根据条件查值 result = models.UserInfo.object.filter(username='root')
result = models.UserInfo.object.filter(username='root',password='123') 相当于and username 和password
4,数据删除
result = models.UserInfo.object.filter(username='root',password='123').delete()删除此行数据
5,数据修改
result = models.UserInfor.object.filter(username='root',password='123').update(password="666")
6,数据操作其他方法
models.UserInfo.object.filter(password='123').first() 找到第一个或者.count()统计个数
9,django admin 配置
(1)创建后台管理员 python manage.py createsuperuser
(2)配置后台管理url url(r'^admin/',admin.site.urls)
(3)注册和配置django后台管理页面
1,打开admin.py,配置如下
from django.contrib import admin from app01 import models admin.site.register(models.UserType)
admin.site.register(models.UserInfo)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)
2,设置数据表名称
class UserType(models.Model):
name = models.CharField(max_length=50) class Meta:
verbose_name = '用户类型'
verbose_name_plural = '用户类型'
10,django models 字段类型
整体包括五类:(1)字符串(2)数字(3)时间(4)二进制(5)自增类型
AutoField(Field)
- int自增列,必须填入参数 primary_key=True
例如
class UserGroup:
uid = models.AutoField(primary_key=True)
BigAutoField(AutoField)
- bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列
from django.db import models class UserInfo(models.Model):
# 自动创建一个列名为id的且为自增的整数列
username = models.CharField(max_length=32) class Group(models.Model):
# 自定义自增列
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32) SmallIntegerField(IntegerField):
- 小整数 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正小整数 0 ~ 32767
IntegerField(Field)
- 整数列(有符号的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正整数 0 ~ 2147483647 BigIntegerField(IntegerField):
- 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 自定义无符号整数字段 class UnsignedIntegerField(models.IntegerField):
def db_type(self, connection):
return 'integer UNSIGNED' PS: 返回值为字段在数据库中的属性,Django字段默认的值为:
'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
'BinaryField': 'longblob',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'DurationField': 'bigint',
'FileField': 'varchar(%(max_length)s)',
'FilePathField': 'varchar(%(max_length)s)',
'FloatField': 'double precision',
'IntegerField': 'integer',
'BigIntegerField': 'bigint',
'IPAddressField': 'char(15)',
'GenericIPAddressField': 'char(39)',
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
'UUIDField': 'char(32)', BooleanField(Field)
- 布尔值类型 NullBooleanField(Field):
- 可以为空的布尔值 CharField(Field)
- 字符类型
- 必须提供max_length参数, max_length表示字符长度 TextField(Field)
- 文本类型 EmailField(CharField):
- 字符串类型,Django Admin以及ModelForm中提供验证机制 IPAddressField(Field)
- 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制 GenericIPAddressField(Field)
- 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
- 参数:
protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both" URLField(CharField)
- 字符串类型,Django Admin以及ModelForm中提供验证 URL SlugField(CharField)
- 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) CommaSeparatedIntegerField(CharField)
- 字符串类型,格式必须为逗号分割的数字 UUIDField(Field)
- 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证 FilePathField(Field)
- 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
- 参数:
path, 文件夹路径
match=None, 正则匹配
recursive=False, 递归下面的文件夹
allow_files=True, 允许文件
allow_folders=False, 允许文件夹 FileField(Field)
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage ImageField(FileField)
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
width_field=None, 上传图片的高度保存的数据库字段名(字符串)
height_field=None 上传图片的宽度保存的数据库字段名(字符串) DateTimeField(DateField)
- 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field)
- 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field)
- 时间格式 HH:MM[:ss[.uuuuuu]] DurationField(Field)
- 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 FloatField(Field)
- 浮点型 DecimalField(Field)
- 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度 BinaryField(Field)
- 二进制类型
11 django models 字段的限制参数
null #db是否可以为空 =True
default # 默认值 =""
primary_key #主键 =True
db_column #列名 ="user"
db_index #索引 =True
unique #唯一索引 =True
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中显示的下拉框,避免连表查询
class UserInfo(models.Model): username = models.CharField(max_length=32)
user_type_choices = (
(1,'超级用户'),
(2,'普通用户'),
(3,'普普通用户'),
)
user_type_id = models.IntegerField(choices=user_type_choices,default=1)
blank #django admin是否可以为空
verbose_name #django admin显示字段中文
editable #django admin是否可以被编辑
error_messages #错误信
help_text #django admin提示
validators
12,django models外键设置
class UserGroup(models.Model):
uid = models.AutoField(primary_key=True)
caption = models.CharField(max_length=32,unique=True)
ctime = models.DateTimeField(auto_now_add=True, null=True)
uptime = models.DateTimeField(auto_now=True, null=True) # user_list = Userinfo.objects.all()
# 读取的时一个queryset的列表对象,封装了id,username,email,user_group_id, 在user_group_id中又封装#了uid和caption
# [obj(id,username,email,user_group_id,,user_group_id(uid,caption)),obj,obj]
# for row in user_list:
# print(row.user_group_id)
# print(row.user_group.uid)
# print(row.user_group.caption)
class UserInfo(models.Model):
# id列,自增,主键
# 用户名列,字符串类型,指定长度
# 字符串、数字、时间、二进制
username = models.CharField(max_length=32,blank=True,verbose_name='用户名')
password = models.CharField(max_length=60, help_text='pwd')
email = models.CharField(max_length=60)
test = models.EmailField(max_length=19,null=True,error_messages={'invalid': '请输入密码'})
# user_group_id 数字
user_group = models.ForeignKey("UserGroup",to_field='uid') # (uid,catption,ctime,uptimew)
user_type_choices = (
(1, '超级用户'),
(2, '普通用户'),
(3, '普普通用户'),
Python 学习第十九天 django知识的更多相关文章
- python 学习笔记十五 django基础
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- python 学习第二十一天,django知识(三)
一,django的url路由系统总结 1,url(/index/,函数或者类) 2,url(/index/(\d+), 函数或者类) 3,url(/index/(?P<nid>\d+),函 ...
- python 学习笔记十九 django深入学习四 cookie,session
缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...
- python 学习笔记十八 django深入学习三 分页,自定义标签,权限机制
django Pagination(分页) django 自带的分页功能非常强大,我们来看一个简单的练习示例: #导入Paginator>>> from django.core.p ...
- python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作
django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...
- python学习三十九天filter() map()用法及lambda搭配使用
python函数中的 filter() map() 前者是过滤的,后者是映射关系,需要与函数搭配使用,这时候匿名函数派上用场了,用简单的表达式就可以显示比较复杂的功能 1,python函数 filte ...
- python学习第二十九天函数局部变量如何改变外部变量
python函数局部变量如何改变外部变量,之前我说过,局部变量是没办法改变外部变量的,除非局部变量找不到,去外部找,输出变量,使用关键词global 使变量改变外部变量. 1,使用关键词global ...
- python学习第十九天三元运算符与php语言区别
三元运算符是条件语句的简写,常见的条件语句写三行,三元运算符只需要写一行,python三元运算符是怎么写的呢 1,常见条件判断 if a<b: print(a) else: print(b) 2 ...
- 孤荷凌寒自学python第六十九天学习并实践beautifulsoup对象用法2
孤荷凌寒自学python第六十九天学习并实践beautifulsoup对象用法2 (完整学习过程屏幕记录视频地址在文末) 今天继续学习beautifulsoup对象的属性与方法等内容. 一.今天进一步 ...
随机推荐
- sql 批量更新某个字段的值
UPDATE Tabel1 t1 set t1.col1= ( SELECT col2 from Tabel2 t2 WHERE t1.col1=t2.col2) where exists ( SEL ...
- SQL SERVER修改函数名引起的问题
1. 问题 今天遇到一个奇怪的问题:使用sp_helptext XXX查询出来的函数定义名竟然跟函数名不同,而sp_helptext实际是查询sys.all_sql_modules这个系统视图的.直接 ...
- Androidstudio预览时出现错误java.lang.NoClassDefFoundError: com/android/util/PropertiesMap
参考博客;http://blog.csdn.net/daqi1983/article/details/51474588 更改对应版本的SDK即可.
- Genymotion安装及遇到的问题
https://www.genymotion.com/ 首先注册,不注册看不到下载按钮. 注册登陆后下载安装包(一定要记住用户名和密码,因为安装后登陆要用) 一路下一步. 选择虚拟设备 genymot ...
- 集群CLUSTER种类介绍
一.集群CLUSTER 介绍 计算机集群Cluster,可以把多台计算机 连接在一起使用,平分资源或互为保障.其好处不言而喻,群集中的每个计算机被称为一个节点,节点可添加可减少,在这些节点之上虚拟出一 ...
- GET和POST有什么区别?及为什么网上的多数答案都是错的
如果有人问你,GET和POST,有什么区别?你会如何回答? 最普遍的答案 回来之后寻思了很久,他到底是想问我什么?我一直就觉得GET和POST没有什么除了语义之外的区别,自打我开始学习Web编程开始就 ...
- 微信小程序与传统APP十大优劣对比
随着微信公众平台的开放,微信端小程序涌现市场,带来很很多便利和简单的原生操作,询:微信端小程序是否会替代传统的APP应用?两者的优劣如何?我们一起来看看传统APP与微信端小程序十大优劣对比 ...
- jquery load 和 iframe 比较
如果要加载的东西比较简单,里面的没有复杂的数据和逻辑,可以使用load.如果要加载的页面自身有复杂的逻辑.操作,还是建议使用ifame,因为iframe里面可以引入自身的js和样式,而load引入的东 ...
- python+paramiko库+svn写的自动化部署脚本
第一篇博文 直接开门见山的说了. 这是件什么事?:每次部署都是复制本地的文件粘贴到服务器端,因为路径复杂,所以费时且手工容易出漏洞. 一直在想有什么办法可以解决这种,因为以前在微软的一个牛人同事做过一 ...
- eclipse中ctrl+h默认打开是JavaSearch,怎么设置成默认打开是FileSearch
window->preferences->General->keys. 找到File Search(有搜索框的,可以搜索),然后在下方 Binding按下ctrl +h .