昨日内容 视图层 视图函数可以是函数也可以是类 只要是处理业务逻辑的视图函数都需要接受一个request参数 FBV与CBV FBV基于函数的视图 CBV基于类的视图 views.py from django.views import View class MyView(View): def get(self,request): return HttpRespose('get请求') def post(self,request): return HttpRespose('post请求') urls.py url(r'^login/',MyView.as_view()) 源码部分 @classonlymethod def as_view(cls,**initkwargs): def view(cls,**initkwargs): pass return view 通过源码分析得到 FBV与CBV在路由匹配上 规则都是意义的 都是url后面跟函数的内存地址 看截图即可 django settings源码 项目通常都会有两个配置文件 一个是暴露给用户可以配置的 一个是项目默认的配置 特点:当用户配置了就使用用户的,当用户没有配就使用项目默认的 django中暴露给用户的配置默认就与项目同名的文件夹中 django项目内部默认的配置文件 from django.conf import global_settings 通常我们在django中使用配置文件一般都是按照一下方式导入的 from django.conf import settings 但是也可以直接带入与项目同名的文件夹中的配置文件 from 项目名 import settings class LazySettings(object): def _setup(self): settings = LazySettings() 详细的看截图即可 参考settings源码书写实例(要求掌握) 模板层 {{}} 变量相关 {%%} 逻辑相关 给模板传值 python所有的数据类型都可以被传递到前端页面 注意在传递函数的时候 会自动加括号调用 前端展示的是函数调用的之后的返回值 (ps:前端在调用函数的时候 是不支持给函数传递额外参数的) 如果你想在前端获取后端传递的某个容器类型中的具体元素 那么你可以通过句点符来获取具体的元素 .索引 .键 过滤器 | 过滤器会将|左边的对象当做过滤器第一个参数传入 或将右侧的对象当做第二个参数传入 |length |add:2 |default:'' |slice:'0:8:2' |filesizeformat |truncatewords:3 按照空格切分 不包含三个点 |truncatechars:6 按照字符切分 三个点也算 也就意味着后面的数字起码得大于3 |safe 前后端取消转义 也及意味着前端的html代码 并不单单只能在html文件中书写 你也可以在后端先生成html代码 然后直接传递给前端(******) 前端 |safe 后端 from django.utils.safestring import mark_safe mark_safe("<a href='url'>xxx</a>") 标签 {%%} if判断 {% if 'sasdasd' %} if条件成立 {% elif 'sadsad' %} elif条件成立 {% else %} 上面两者都不成立 {% endif %} for循环 {% for %} {{ forloop }} {{ forloop.first }} {{ forloop.last }} {{ forloop.counter0 }} {{ forloop.counter }} 数据库中的数据它的主键值 不可能是依次递增的 有可能被你删除了几条数据 主键值就不再连续的了 {% empty %} 当for循环对象不能被for循环的时候会走empty逻辑 {% endfor %} for循环里面是可以嵌套if判断的 {% with l.0.2.name as ttt %} {% endwith %} 自定义过滤器 标签 inclusion_tag 1.先在应用名下的文件夹中新建一个名字必须叫做templatetags文件夹 2.在该文件夹内新建一个任意名称的py文件 3.在该py文件中 必须先写一下两句代码 from django import template register = template.Library() # 自定义过滤器 @register.filter(name='mysum') def mysum(a,b) retunr a + b # 自定义标签 @register.simple_tag(name='myplus') def myplus(a,b,c,d,e): return None # 自定义inclusion_tag @register.inclusion_tag('mytag.html') def mytag(n): ... # return {'l':l} return locals() 在html上使用需要先导入后使用 {% load py文件名 %} {{ 2|mysum:1}} {% myplus 1 2 3 5 5 %} {% mytag 10 %} 模板的继承与导入 当多个html页面需要使用相同的html代码块的时候 你可以考虑使用继承 首先需要你在模板html代码中 通过block块儿划定后续想要修改的区域 {%block content%} {%endblock%} 一般情况下 模板html文件内应该有三块区域 css,content,js 模板的导入 {% extends '模板的名字'%} {%block content%} 修改模板中content区域的内容 {{ block.super }}重新复用模板的html样式 {%endblock%} 模板的导入 {% include '你想要导入的html文件名'%} 模型层单表的增删改查
Django终端打印SQL语句
如果你想知道你对数据库进行操作时,Django内部到底是怎么执行它的sql语句时可以加下面的配置来查看
在Django项目的settings.py文件中,在最后复制粘贴如下代码:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
配置好之后,再执行任何对数据库进行操作的语句时,会自动将Django执行的sql语句打印到pycharm终端上
补充:
除了配置外,还可以通过一点.query即可查看查询语句,具体操作如下:
Django orm 字段合集
AutoField(Field) - int自增列,必须填入参数 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 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) - 二进制类型 字段合集
Django orm 字段参数
null 用于表示某个字段可以为空。 unique 如果设置为unique=True 则该字段在此表中必须是唯一的 。 db_index 如果db_index=True 则代表着为此字段设置索引。 default 为该字段设置默认值。 DateField和DateTimeField auto_now_add 配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。 auto_now 配置上auto_now=True,每次更新数据记录的时候会更新该字段。
Django orm 关系字段复习
ForeignKey 外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。 ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。 字段参数 to 设置要关联的表 to_field 设置要关联的表的字段 on_delete 当删除关联表中的数据时,当前表与其关联的行的行为。 models.CASCADE 删除关联数据,与之关联也删除 db_constraint 是否在数据库中创建外键约束,默认为True。 OneToOneField 一对一字段。 通常一对一字段用来扩展已有字段。(通俗的说就是一个人的所有信息不是放在一张表里面的,简单的信息一张表,隐私的信息另一张表,之间通过一对一外键关联) 字段参数 to 设置要关联的表。 to_field 设置要关联的字段。 on_delete 当删除关联表中的数据时,当前表与其关联的行的行为。(参考上面的例子)
必知必会13条
操作下面的操作之前,我们实现创建好了数据表,这里主要演示下面的操作,不再细讲创建准备过程
<1> all(): 查询所有结果
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
<4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
<5> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
<6> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<7> order_by(*field): 对查询结果排序
<8> reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。
<9> distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)
<10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
<11> first(): 返回第一条记录
<12> last(): 返回最后一条记录
<13> exists(): 如果QuerySet包含数据,就返回True,否则返回False
返回QuerySet对象的方法有
all()
filter()
exclude()
order_by()
reverse()
distinct()
特殊的QuerySet
values() 返回一个可迭代的字典序列
values_list() 返回一个可迭代的元祖序列
返回具体对象的
get()
first()
last()
返回布尔值的方法有:
exists()
返回数字的方法有
count()
单表查询值之神奇的下划线
多表操作 图书管理系统表创建 一对多:ForeignKey 一对一:OnoToOneField 可以用ForeignKey代替ForeignKey(unique=True) 上面两个关键字所创建出来的字段会自动加上_id后缀 多对多:ManyToManyFiled 该字段并不会真正的在表中展示出来 它仅仅是一个虚拟字段 1.告诉orm自动创建第三种表 2.帮助orm跨表查询
一对多字段的增删改查
增
改
删
多对多字段的增删改查