任丘网站优化,接任务做兼职的的网站,学校网站建设源代码,泰安58同城二手房一、过滤器 1.1 编写步骤 1 注册app2 在某个app下#xff1a;创建templatetags模块(模块名只能是templatetags#xff09;3 在包下写一个py文件#xff0c;随便命名 在py文件中#xff1a;写入 from django import templateregister template.Library() #xff08;注创建templatetags模块(模块名只能是templatetags3 在包下写一个py文件随便命名 在py文件中写入 from django import templateregister template.Library() 注register的名字是固定的,不可改变 5 定义自己的标签或过滤器 register.filter
def filter_words(content: str) - str:l [妈的, 傻逼, 退游]# 把content中所有关键词替换返回for item in l:content content.replace(item, **)return contentregister.simple_tag
def my_input(id,arg):result input typetext id%s class%s / %(id,arg)return mark_safe(result) 6. 在模板中使用 {% load common_filter %} 使用 p{{ content|filter_words}}/p {% my_input 7 red %} 二、 模型层
2.1 基本使用
2.1.1 orm框架---》对象关系映射 程序中一个个类一个个对象 以后数据库中一张表---》对应程序中一个类 以后数据库中一条记录--》对应程序中一个对象 2.1.2 数据库表中字段有很多类型 intvarchartext 程序的类中---》字段--》有很多类型 CharField DecimalField 2.1.3 写类与执行命令 1.写一个类 class Book(models.Model):id models.AutoField(primary_keyTrue)title models.CharField(max_length64, nullFalse)price models.DecimalField(max_digits7, decimal_places2) 2. 执行命令 python manage.py makemigrations python manage.py migrate 2.2 常用字段 AutoField(Field) - int自增列必须填入参数 primary_keyTrue BigAutoField(AutoField) - bigint自增列必须填入参数 primary_keyTrue 注当model中如果没有自增列则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 username models.CharField(max_length32) class Group(models.Model): # 自定义自增列 nid models.AutoField(primary_keyTrue) name models.CharField(max_length32) 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 机制 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, 文件夹路径 matchNone, 正则匹配 recursiveFalse, 递归下面的文件夹 allow_filesTrue, 允许文件 allow_foldersFalse, 允许文件夹 FileField(Field) - 字符串路径保存在数据库文件上传到指定目录 - 参数 upload_to 上传文件的保存路径 storage None 存储组件默认django.core.files.storage.FileSystemStorage ImageField(FileField) - 字符串路径保存在数据库文件上传到指定目录 - 参数 upload_to 上传文件的保存路径 storage None 存储组件默认django.core.files.storage.FileSystemStorage width_fieldNone, 上传图片的高度保存的数据库字段名字符串 height_fieldNone 上传图片的宽度保存的数据库字段名字符串 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) - 二进制类型 2.4 常用非常用字段参数 # null 如果为TrueDjango 将用NULL 来在数据库中存储空值。 默认值是 False. # blank 后台管理---》admin中会用咱们一般用的少 如果为True该字段允许不填。默认为False。 要注意这与 null 不同。null纯粹是数据库范畴的而 blank 是数据验证范畴的。 如果一个字段的blankTrue表单的验证将允许该字段是空值。如果字段的blankFalse该字段就是必填的。 # default 字段的默认值。可以是一个值或者可调用对象。如果可调用 每有新对象被创建它都会被调用。 # primary_key 如果为True那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_keyTrue Django 就会自动添加一个IntegerField字段做为主键所以除非你想覆盖默认的主键行为 否则没必要设置任何一个字段的primary_keyTrue。 # unique 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的 # db_index 该字段建立索引 # choices 由二元组组成的一个可迭代对象例如列表或元组用来给字段提供选择项。 如果设置了choices 默认的表单将是一个选择框而不是标准的文本框br而且这个选择框的选项就是choices 中的选项。 get_type_book_display() # 关于Meta中 class UserInfo(models.Model): nid models.AutoField(primary_keyTrue,indexTrue) username models.CharField(max_length32) mobilemodels.CharField(max_length32) class Meta: # 数据库中生成的表名称 默认 app名称 下划线 类名 db_table table_name # 联合索引 index_together [ (username, mobile), ] # 联合唯一索引 unique_together ((username, mobile),) # admin中显示的表名称 verbose_name图书表 # verbose_name加s verbose_name_plural 2.5 settings配置 orm 可以操作sqlitemysqloraclepostgresql。。。。 # 配置文件中的配置 ### 默认配置操作sqlite DATABASES { default: { ENGINE: django.db.backends.sqlite3, NAME: BASE_DIR / db.sqlite_lqz, } } #### 操作mysql # 配置文件 DATABASES { default: { ENGINE: django.db.backends.mysql, NAME: day05, HOST:127.0.0.1, PORT:3306, USER:root, PASSWORD:1234, } } #装模块pymsql模块mysqlclient pip3 install mysqlclient #其他不需要任何操作----》有可能在你机器装不上mac pip3 install pymysql --upgrade # 保证它执行放在配置文件中 import pymysql pymysql.install_as_MySQLdb() 2.6 基本操作(增加删除字段增加记录删除记录查询记录) 增加删除字段只需要在表模型增加注释字段增加删除字段参数再迁移就可以了 -不要轻易删除迁移记录 增加表记录 # 方案一 Book.object.create() #方案二 bookBook(参数) book.save() 删除记录 -删除方式一查出来再删 Book.objects.all().delete() -删除方式二 #可以重写类中得delete方法 bookBook.objects.filter(pk1).first() book.delete() #Book 类中有个delete方法咱们没有写---》父类的--》可以重写 更新 -更新方式一查出来再删 Book.objects.all().update() -更新方式二 bookBook.objects.filter(pk1).first() book.namess book.save() 查 # all(): 查询所有结果 # filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 # get(**kwargs): 返回与所给筛选条件相匹配的对象返回结果有且只有一个如果符合筛选条件的对象超过一个或者没有都会抛出错误。 # exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 # order_by(*field): 对查询结果排序(-id) # reverse(): 对查询结果反向排序 # count(): 返回数据库中匹配查询(QuerySet)的对象数量。 # first(): 返回第一条记录 # last(): 返回最后一条记录 # exists(): 如果QuerySet包含数据就返回True否则返回False #values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet运行后得到的并不是一系列 model的实例化对象而是一个可迭代的字典序列 #values_list(*field): 它与values()非常相似它返回的是一个元组序列values返回的是一个字典序列 # distinct(): 从返回结果中剔除重复纪录 2.7 多表操作-创建关系 class Book(models.Model): name models.CharField(max_length32) price models.DecimalField(max_digits5, decimal_places2) publish_date models.DateField() publish models.ForeignKey(toPublish,on_deletemodels.CASCADE) #这不是个字段 authorsmodels.ManyToManyField(toAuthor) def __str__(self): return self.name class Author(models.Model): name models.CharField(max_length32) age models.IntegerField() author_detail models.OneToOneField(toAuthorDatail,uniqueTrue,on_deletemodels.CASCADE) class AuthorDatail(models.Model): telephone models.BigIntegerField() birthday models.DateField() addr models.CharField(max_length64) class Publish(models.Model): name models.CharField(max_length32) city models.CharField(max_length32) email models.EmailField() 关联关系有如下几种 - 一对一本质就是一对多只不过多的字段唯一 -一对多:外键关联 -多对多必须要有中间表 # OneToOneFieldForeignKey 必须写on_delete不写报错 on_delete可选的参数有哪些 #1 models.CASCADE 级联删除---》删除出版社---》当前出版社下所有的图书数据都会被删除 #2 models.SET_NULL 删除出版社---》当前出版社下所有的图书数据都会的publish_id字段都是置为空 publish models.ForeignKey(toPublish,on_deletemodels.SET_NULL,nullTrue) #3 models.SET_DEFAULT 删除出版社---》当前出版社下所有的图书数据都会的publish_id字段都设为默认值 publish models.ForeignKey(toPublish,on_deletemodels.SET_DEFAULT,default1) #4 models.SET(值/可调用对象)删除出版社---》当前出版社下所有的图书数据都会的publish_id字段都设为SET传入的值如果是可调用对象会执行可调用对象把return变 # 5 models.DO_NOTHING 删除出版社---》当前出版社下所有的图书数据都会的publish_id字段 原封不动 publish models.ForeignKey(toPublish,on_deletemodels.DO_NOTHING,db_constraintFalse) 2.8 基于对象的跨表查询 假设拿到book对象 book.name book.price book.publish_id ----数字---》出版社id号---》咱们可以通过出版社id再去出版社表查出当前出版社---》很麻烦 -----快捷方式----- book.publish----拿到的是 publish对象---》当前图书的出版社对象 book.publish.继续往后点击 上面这种查询方式称之为基于对象的跨表查询 对象对象.字段 publishbook.pulish 有正向查询和 反向查询---》拿到的都是对象 -正向当前表中有那个字段类似于book.pulish author.author_detail -通过字段 -反向当前表中没有那个字段 author_detail.author 通过author_detail拿到author -通过表名小写 一对一正反向 太简单 一对多和多对多的正反向 正向简单 publishbook.pulish 反向 publish对象---》拿到当前publish对象下所有出版过的图书--反向查询 puhlish.book_set.all() # 如果是反向多条就要用 表名小写_set.all() 多对多正反向 # 正向 拿到当前图书所有作者 book.authors.all() # 正向--》对象.字段.all() # 反向 拿到当前作者写的所有图书 author.book_set.all() #反向--》多条就要用 表名小写_set.all()