DAY 48 django03
-
路由分发
在django中所有的应用都可以有自己独立的路由层、模板层、静态文件
路由分发是为了解决总路由代码过于冗余的情况
include('应用名.urls')
注意事项
总路由最后千万不要加$ -
当多个应用出现反向解析起别名冲突的情况
include('应用名.urls',namespace='自定义名称空间名字')
reverse('自定义名称空间名字:别名')
{% url '自定义名称空间名字:别名' %}
# 名称空间其实也可以不使用 只要我们做到所有的别名不冲突即可,eg:在每个别名前面加上各自应用名作为前缀 -
本地虚拟环境
类似于docker容器,给每个项目配备独立的运行环境
ps:requirements.txt
创建虚拟环境类似于重新下载了一个纯净的python解释器 -
django版本区别
1.路由层使用的方法不一样
url()
path()
re_path() == url()
2.转换器
3.2.X与3.X区别
3.X新增了异步功能 -
三板斧本质
返回HttpResponse对象
-
JsonResponse
JsonResponse(obj,json_dumps_params,safe)
ps:看源码学习的好处 -
FBV与CBV及源码
FBV
def index(request):
return HttpResponse('index')
CBV
from django.views import View
class MyClassView(View):
def get(self,request):
return HttpResponse('get')
def post(self,request):
return HttpResponse('post')
url(r'^login/',views.MyClassView.as_view())
# 为什么能够根据前期方式的不同自动匹配执行对应的方法
class View(...):
-
django settings源码
-
模板语法传值
-
模板语法之过滤器
-
模板语法之标签
-
自定义过滤器、标签、inclusion_tag
-
模板的继承
-
模板的导入
-
模型层(单表查询关键字)
django settings源码
"""
1.django其实有两个配置文件
一个是暴露给用户可以自定义的配置文件
项目根目录下的settings.py
一个是项目默认的配置文件
当用户不做任何配置的时候自动加载默认配置
2.配置文件变量名必须是大写
"""
疑问:为什么当用户配置了就使用用户配置的 不配置就是要默认的
from django.conf import settings
settings = LazySettings()
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day05.settings")
ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
class LazySettings(LazyObject):
def _setup(self, name=None):
# os.environ看成是一个全局大字典 'day05.settings'
settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
self._wrapped = Settings(settings_module) # Settings('day05.settings')
class Settings(object):
def __init__(self, settings_module): # 'day05.settings'
for setting in dir(global_settings): # 获取全局配置文件里面所有的变量名
if setting.isupper(): # 校验是否是纯大写
setattr(self, setting, getattr(global_settings, setting))
# 给Settings对象添加全局配置文件中所有的配置信息
self.SETTINGS_MODULE = settings_module # 'day05.settings'
mod = importlib.import_module(self.SETTINGS_MODULE)
# from day05 import settings # 导入暴露给用户的自定义配置文件
for setting in dir(mod):
if setting.isupper():
setting_value = getattr(mod, setting)
setattr(self, setting, setting_value)
模板语法之传值
# 传值方式1:利用字典挨个传值
return render(request,'index.html',{'i':i,'f':f,'s':s})
# 传值方式2:简单粗暴 locals()将当前名称空间中所有的变量名全部传递给页面
return render(request,'index.html',locals())
"""
传值方式1 传值精确 不会造成资源浪费
传值方式2 传值粗糙 可能会造成一定的资源浪费
ps:为了教学方便 我们以后就是用locals()
"""
补充:传递函数名和类名都会自动加括号调用(模板语法不支持额外的传参)
模板语法之获取值
'''django模板语法取值只能采用 句点符(.) '''
索引 键都可以无限制的点点点
<p>{{ d.hobby.3.username }}</p>
模板语法之过滤器
# 类似于python的内置方法
<p>过滤器:将竖杆左侧的数据当做第一个参数</p>
<p>统计长度:{{ s|length }}</p>
<p>加法运算:{{ i|add:100000000000 }}</p>
<p>字符串拼接:{{ s|add:'heiheihei' }}</p>
<p>日期格式:{{ ctime|date:'Y年-m月-d日' }}</p>
<p>默认值:{{ b|default:'哈哈' }}</p>
<p>默认值:{{ b1|default:'哈哈' }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>截取文本(三个点也算):{{ s|truncatechars:6 }}</p>
<p>截取文本(三个点不算)空格:{{ s|truncatewords:3 }}</p>
<p>{{ h|safe }}</p>
<p>{{ sss }}</p>
<p>{{ sss1 }}</p>
转义
前端
|safe
后端
from django.utils.safestring import mark_safe
sss1 = mark_safe('<h2>老子要挣大钱</h2>')
ps:前端代码也可以在后端写好传入!!!
模板语法之标签
# 类似于python的流程控制
{% for foo in s %}
{% if forloop.first %}
<p>这是我的第一次~~</p>
{% elif forloop.last %}
<p>这是最后一次了啊~</p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% empty %}
<p>传入的数据是空的</p>
{% endfor %}
"""
{{}} 变量相关
{%%} 逻辑相关
"""
# 了解
{% with d.hobby.3.username as name %}
{{ name }}
{{ d.hobby.3.username }}
{% endwith %}
自定义过滤器、标签、inclusion_tag
# 类似于python里面的自定义函数
1.在应用下创建一个名字必须叫"templatetags"文件夹
2.在上述文件夹内创建一个任意名称的py文件
3.在该py文件内固定先书写以下两句话
from django import template
register = template.Library()
# 自定义过滤器
模板的导入
# 类似于后端到模块 想要什么局部页面直接导入即可
{% include 'myform.html' %}
模板的继承
先使用block划定区域
母版
{% block 区域名称 %}
{% endblock %}
子版
{% extends 'home.html' %}
{% block 区域名称 %}
{% endblock %}
母版在划定区域的时候一般都应该有三个区域
css区域
html文档区域
js区域
ps:目的是为了让子版具有独立的css js等 增加扩展性
{% block css %}
{% endblock %}
{% block content %}
{% endblock %}
{% block js %}
{% endblock %}
ps:子版也可以继续使用母版划定区域内的内容
{{ block.super }}