django学习CBV源码,模板语法传值,过滤器,标签,模板继承,模板导入

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>

提示找不到样式那肯定是引入路径错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值