CBV源码剖析
#不要修改源码,出了bug很难找
#突破口在urls.py
path('login/', views.MyLogin.as_view()),
#与path('login/',views.view) FBV一模一样
#CBV与FBV在路由匹配上本质是一样的,都是路由对应函数内存地址
函数名、方法名 加括号执行优先级最高
猜测:
as_view()
要么是被@staicmethod修饰的静态方法
要么是被@classmethod修饰的类方法 正确
@classonlymethod
def as_view(cls, **initkwargs):
'''
@classonlymethod
def as_view(cls, **initkwargs):
"""Main entry point for a request-response process."""
def view(request, *args, **kwargs):
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs)
return view
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
#getattr反射
'''
模板语法传值
{{}}:变量相关
{%%}:逻辑相关
def index(request):
#模板语法可以传递的的后端python数据类型
n = 123
f = 123.345
s = '你是水哥'
b = True
l = ['哈哈','学习','得到','看看']
t = (11,222,333,444)
d = {'username':'lz','password':123,'age':18,'gender':'male'}
se = {'应用','天天','匹配'}
def func():
print('快快快')
return '很好的'
class MyClass(object):
def get_self(self):
return 'self'
@staticmethod
def get_func():
return 'func'
@classmethod
def get_class(cls):
return 'cls'
#对象被展示到html页面上,就类似于执行了打印操作也会触发__str__方法
def __str__(self):
return '哈哈哈'
obj = MyClass()
# return render(request,'index.html',{}) #一个个传
return render(request,'index.html',locals())
<p>{{ n }}</p>
<p>{{ f }}</p>
<p>{{ s }}</p>
<p>{{ b }}</p>
<p>{{ l }}</p>
<p>{{ d }}</p>
<p>{{ t }}</p>
<p>{{ se }}</p>
<p>{{ func }}</p>
<!--传递函数名会自动加括号调用,但是模板语法不支持给函数传额外的参数-->
<!--传类名的时候也会自动加括号调用(实例化)-->
<!--内部能够自动判断出当前的变量名是否可以加括号调用,如果可以
就会自动执行,针对的是函数名和类名-->
<p>{{ MyClass }}</p>
<p>{{ obj }}</p>
<p>{{ obj.get_self }}</p>
<p>{{ obj.get_func }}</p>
<p>{{ obj.get_class }}</p>
#django模板语法的取值,是固定的格式,只能采用’句点符‘ .
<p>{{d.username}}</p>
<p>{{l.0}}</p>
<p>{{d.info.2.hobby}}</p>
#既可以点键也可以点索引,还可以两者混用在这里插入代码片
过滤器
#过滤器类似于模板语法内置的,内置方法
#基本语法
{{数据|过滤器:参数}}
#转义
#前端
|safe
#后端
from django.utils.safestring import mark_safe
res = mark_safe('<h1>信心</h1>')
#前端代码不一定要在前端写,也可以在后端写传递到前端在这里插入代码片
标签
#for循环
{% for foo in l %} #foo随便起的别名
<p>{{forloop}}</p>
<p>{{foo}}</p>
{% endfor %}
{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}
模板继承
#很多网站页面整体都差不多,只是某一些局部在做变化
#模板的继承,你自己先选好一个想要继承的模板页面
{% extends 'home.html' %}
#继承之后子页面和模板页面一模一样,你需要在模板页面上提前划定可以被修改的区域
{% block content %}
模板内容
{% endblock %}
#子页面就可以声明想要修改那块划定的区域
{% block content %}
子页面内容
{% endblock %}
#一般情况下模板页面上应该至少有三块可以被修改的区域
1、css区域
2、html区域
3、js区域
{% block css %}
{% endblock %}
{% block content %}
{% endblock %}
{% block js %}
{% endblock %}
#每一个子页面就都有了自己独有的css代码,html代码,js代码
'''
一般情况下,模板的页面上划定的区域越多,那么该模板的扩展性越强
'''
模板导入
'''
将页面的某一个局部当做模块的形式
那个地方需要就直接导入使用即可
'''
{% include 'hh.html' %}
注意:当在django项目中创建了templates项目,然后在里面的所有html代码引入的样式无法显示,可以在引入css和js时候,在目录前面加上’ /',或者写入
{% load static %}
<link rel="stylesheet" href="{% static '/bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static '/bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
提示找不到样式那肯定是引入路径错误。