1.模板
1.1 寻找html模板
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
# 'django.contrib.auth.context_processors.auth',
# 'django.contrib.messages.context_processors.messages',
],
},
},
]
优先去项目根目录 > 每个已注册的app的templates目录找。
如何选择:
- 简单的项目,模板都放在根目录。
- 复杂的项目,模板放在各自的app中,公共部分放在templates目录。
扩展:修改内置app的模板也是同样的套路。
1.2 模板处理的本质
渲染完成后,生成了字符串,再返回给浏览器。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N4vZkh9j-1691468023302)(assets/image-20220703100004360.png)]](https://img-blog.csdnimg.cn/01c764223f9948b08f57e7ba807b563b.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tw7zsCcE-1691468023304)(assets/image-20220703100634467.png)]](https://img-blog.csdnimg.cn/5eeda0bfefc7440c87bb63ed76b8245e.png)
1.3 常用语法
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yRptEWnS-1691468023305)(assets/image-20220703104019949.png)]](https://img-blog.csdnimg.cn/44617e60c1a8493a92313774c50956bb.png)
1.4 内置函数
在django模板语法中提供了内置函数让我们来。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OaMhpcFY-1691468023305)(assets/image-20220703104857782.png)]](https://img-blog.csdnimg.cn/e40d1cac042a4ab78a7018b11b7f48b7.png)
1.5 自定义模板功能
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IiFPsS3Z-1691468023305)(assets/image-20220703110604253.png)]](https://img-blog.csdnimg.cn/98735ed6819147e6bbbc13b60e0cb64a.png)
三种方式:
- filter
- 数据处理,参数:1~2个
- 数据处理,if条件
- simple_tag
参数无限制 & 返回文本
- inclusion_tag
参数无限制 & HTML片段
需求来了:根据用户权限不同显示不同的菜单。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vmL6Gj7F-1691468023306)(assets/image-20220703112043922.png)]](https://img-blog.csdnimg.cn/049529d78b7847228fcefdb1d32e338e.png)
1.6 继承和母版
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ms1RLZnv-1691468023306)(assets/image-20220703114930894.png)]](https://img-blog.csdnimg.cn/6a06cb1f9b514ac68633740431658dfb.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1vAoVHKl-1691468023307)(assets/image-20220703114941168.png)]](https://img-blog.csdnimg.cn/46d07b29052e4083802be1c28365f36b.png)
1.7 模板的导入
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aXK8Iju4-1691468023307)(assets/image-20220703115519438.png)]](https://img-blog.csdnimg.cn/2e34c6aacec742589317596bf6978d9c.png)
2.django中间件
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AuUp6UV7-1691468023308)(assets/image-20220703140649928.png)]](https://img-blog.csdnimg.cn/42134a31428f41dcbaa0c8dc9f245f8e.png)
- 类
- 定义方法
- 注册
2.1 原始方式
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iGqHdEXS-1691468023308)(assets/image-20220703141259948.png)]](https://img-blog.csdnimg.cn/045844c8fcc64ec3942cb05598e3cde5.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-plJe5Z6Z-1691468023308)(assets/image-20220703141313488.png)]](https://img-blog.csdnimg.cn/059d21fbd9004146ad9ae0beee986e4d.png)
2.2 MiddlewareMixin(建议)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rlx2DVzo-1691468023309)(assets/image-20220703142923194.png)]](https://img-blog.csdnimg.cn/840335c22498498a862e392fc6884ec1.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nw6V7voG-1691468023309)(assets/image-20220703142936794.png)]](https://img-blog.csdnimg.cn/3b9d4e5862bc466cbac368c92350147c.png)
注意:django1版本。
源码:
-
面向对象
class MyMd(object): def __init__(self....): pass def __call__(self,....): pass django内部默认执行call方法,传入参数。 -
反射
class MyMd(object): def __init__(self....): pass def __call__(self,....): if hasattr(self,'process_request'): response = self.process_request(request) ... django内部默认执行call方法,传入参数。class MiddlewareMixin: def __init__(self, get_response=None): self.get_response = get_response def __call__(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) response = response or self.get_response(request) if hasattr(self, 'process_response'): response = self.process_response(request, response) return response class MyMd(MiddlewareMixin): def process_request(self,request): ... def process_response(self,request, response): ... django内部默认执行call方法,传入参数。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JvoSTSDm-1691468023310)(assets/image-20220703145219921.png)]](https://img-blog.csdnimg.cn/f02f152963444b07af71714bd690e7b2.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RnN2ygqP-1691468023310)(assets/image-20220703145158733.png)]](https://img-blog.csdnimg.cn/9c9962647a924026b2677bd66090f4c4.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bevndhxT-1691468023310)(assets/image-20220703145210733.png)]](https://img-blog.csdnimg.cn/1394133acf554582bffc2227d2a1aa97.png)
疑问:prcess_request的执行时,是否已执行了路由匹配?
request.resolver_match
注意:process_view是在django中源码中写死了。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wf6jFPje-1691468023311)(assets/image-20220703151639813.png)]](https://img-blog.csdnimg.cn/45fe3ed8722b4feaa3e62c7a3474e6d4.png)
2.3 其他
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lW1V9cmf-1691468023311)(assets/image-20220703153559256.png)]](https://img-blog.csdnimg.cn/92076e1ba6fa45f6ba468a3431445892.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WxV2CsNi-1691468023312)(assets/image-20220703153616241.png)]](https://img-blog.csdnimg.cn/4911614f0de24b109652fe17a5c8107c.png)
小结
- 定义中间类
- 类方法
- process_request
- process_view
- process_reponse
- process_exception,视图函数出现异常,自定义异常页面。
- process_template_response,视图函数返回
TemplateResponse对象 or 对象中含有.render方法。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wgNYCLYq-1691468023312)(assets/image-20220703155414569.png)]](https://img-blog.csdnimg.cn/2c0b90ddb70d4394a2c54928276074ec.png)
3.ORM操作
orm,关系对象映射,本质翻译的。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0dAKVXCT-1691468023312)(assets/image-20220703155844071.png)]](https://img-blog.csdnimg.cn/f8c1cea0b4a04868b22fc366d89cc78a.png)
3.1 表结构
实现:创建表、修改表、删除表。
在app中的models.py中按照规则编写类 ===> 表结构。
-
编写类
from django.db import models class UserInfo(models.Model): name = models.CharField(max_length=16) age = models.IntegerField() -
注册app
INSTALLED_APPS = [ # 'django.contrib.admin', # 'django.contrib.auth', # 'django.contrib.contenttypes', # 'django.contrib.sessions', # 'django.contrib.messages', 'django.contrib.staticfiles', 'apps.app01.apps.App01Config', 'apps.app02.apps.App02Config', ] -
命令,django根据models中类生成一个
对数据库操作的配置文件=>migrationspython manage.py makemigrations![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y5jIoxgK-1691468023312)(assets/image-20220703160914596.png)]](https://img-blog.csdnimg.cn/89b346ae9cf548fa9ddae4d4062d82a2.png)
-
命令,读取已经注册么给app中的migrations目录将配置文件 -> 转换成:生成表,修改表 SQL -> 连接数据库去运行。
python manage.py migrate- 那个数据库?
- 数据库账户和密码?
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5IxnhTdl-1691468023313)(assets/image-20220703162050698.png)]](https://img-blog.csdnimg.cn/969acf658fc34405896c4fd5318e258a.png)
常见问题:请不要再手动去修改数据的表结构 + 时刻保证 ORM和数据表是对应。
3.1.1 常见字段和参数
-
字段
CharField SmallIntegerField IntegerField BigIntegerField DateField DateTimeField BooleanField -> 其实数据库不支持真假,根据SmallIntegerField创造出来出来。 0 1 DecimalField -> 精确的小数 -
参数
name = models.CharField(verbose_name="姓名", max_length=16) name = models.CharField(verbose_name="姓名", max_length=16, default="哈哈哈") # 经常查询,速度快(MySQL,https://www.bilibili.com/video/BV15R4y1b7y9) name = models.CharField(verbose_name="姓名", max_length=16, default="哈哈哈", null=True, blank=True, db_index=True) email = models.CharField(verbose_name="姓名", max_length=16, default="哈哈哈", null=True, blank=True, unique=True) # 在数据库存储时只能是:sh、bj (上海、北京一般用于页面显示中文) code = models.CharField(verbose_name="姓名", max_length=16, choices=(("sh", "上海"), ("bj", "北京")),default="sh")# 不用 max_length=16 count = models.IntegerField(verbose_name="数量", default=1, null=True, blank=True, unique=True) code = models.IntegerField(verbose_name="性别",choices=((1, "男"), (2, "女")),default=1)register_date = models.DateField(verbose_name="注册时间", auto_now=True)amount = models.DecimalField(verbose_name="余额", max_digits=10, decimal_places=2)
示例:
from django.db import models
class UserInfo(models.Model):
name = models.CharField(verbose_name="姓名", max_length=16, db_index=True)
age = models.PositiveIntegerField(verbose_name="年龄")
email = models.CharField(verbose_name="邮箱", max_length=128, unique=True)
amount = models.DecimalField(verbose_name="余额", max_digits=10, decimal_places=2, default=0)
register_date = models.DateField(verbose_name="注册时间", auto_now=True)
class Goods(models.Model):
title = models.CharField(verbose_name="标题", max_length=32)
# detail = models.CharField(verbose_name="详细信息", max_length=255)
detail = models.TextField(verbose_name="详细信息")
price = models.PositiveIntegerField(verbose_name="价格")
count = models.PositiveBigIntegerField(verbose_name="库存", default=0)
3.1.2 表关系
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nn8JHd5i-1691468023313)(assets/image-20220703173556969.png)]](https://img-blog.csdnimg.cn/8173888ed761428d85b932d9a0efa351.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YYzEpYcs-1691468023313)(assets/image-20220703174433414.png)]](https://img-blog.csdnimg.cn/4937470c987948a791396fb56e8c0932.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RrKUispR-1691468023313)(assets/image-20220703175051329.png)]](https://img-blog.csdnimg.cn/d4e5f76f6f2d45498764f3b2fd0f0ffb.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L09vUmEU-1691468023314)(assets/image-20220703175312854.png)]](https://img-blog.csdnimg.cn/98deb23c52a54c61b05dfcd6075d6b68.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v5SZBXPB-1691468023314)(assets/image-20220703175556444.png)]](https://img-blog.csdnimg.cn/6281b5d61f1b48e88de44a6dd5bf4df8.png)
注意:ManyToManyField生成的表字段只能id/bid/gid



















