zoukankan      html  css  js  c++  java
  • django -- 母版继承

    csrf_token

    在之前我们提交post请求的时候,都是在setting.py文件里注释掉了 'django.middleware.csrf.CsrfViewMiddleware' 这一行,这是因为form表单提交数据时,Django防止恶意者进行攻击,出于安全的考虑,试想一下,你自己写的django后台,别人写了一个页面,action里地址写的是你的服务器的地址,如果这个人写的代码是攻击你网站的,如果你网站不做校验就接收了。那很有可能会出问题,所以django默认会拒绝掉post请求,如果不想注释掉那行代码,只需要在form表单里加上如下一行代码就可以了

    {% csrf_token %}

    这时候我们去网页上查看代码,会发现页面多了一个隐藏的input标签,这样的话Django就能区分是我们自己写的HTML文件还是别人的,如果HTML文件里没有这行就会报错

    <input type="hidden" name="csrfmiddlewaretoken" value="Faz2aNAt5PaPVW93espQ12sT9DyZtqqIpsSC089vfcdgA072I4dTMbPzsStKxmUB">

     母板

    在我们写HTML的时候,有些页面大体都是相同的,比如博客园,只有第二部分是不同的,其余的都是相同的,这时候我们可以把公共的代码提取出来,我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。

    public_main.html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <meta charset="utf-8">
        <title>Dashboard Template for Bootstrap</title>
        <!-- Bootstrap core CSS -->
        <link href="/static/bootstrap-3.3.7/css/bootstrap.css" rel="stylesheet">
        <link href="/static/dashboard.css" rel="stylesheet">
    </head>
    
    <body>
    
    
      <div >     这里写公共的代码
            <div >  这里也写公共的代码
                
    
                {% block main_page %}  这里是给继承这个模版写的代码,后面的main_page随便起
    
                {% endblock %}
            
           </div>
     </div>
    
    <script src="/static/jquery-3.3.1.js"></script>
    <script src="/static/bootstrap-3.3.7/js/bootstrap.js"></script>
    </body>
    </html>

     这样我们就创建好了一个母版,那怎么使用母版呢?我们创建一个index.html

    {% extends 'list/public_main.html' %}  继承母版,注意,要用/,前面的list是目录名
    
    {% block main_page %}
    
          <div class="c1">   这里写自己的代码,会把这里面的代码放到母版里的那两行代码之间
    
    {% endblock %}

    注意:

    1.继承的代码写在第一行

    2.继承的母版的名字必须用引号引起来

    3.自定义的内容写在 block中

    4.定义多个block块,一般要有js,css

    总结:

    {% extends 'xxxx.html' %}来继承母版

    通过在母板中使用{% block xxx %}来定义"块"。

    在子页面中通过定义母板中的block名来对应替换母板中相应的内容。

    组件

    在来看看博客园,上面的导航栏是不是也是每个页面都有的,我们也可以把导航栏写成一个组件,在其他页面导入,组件就是一个HTML代码

    创建一个xxx.html文件,里面写上一些HTML代码

    然后在母版中或者其他的页面引用

    {% include 'xxx.html' %}

    可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如上语法导入即可。

    静态文件相关

    我们在前面写的css,js文件,都在static目录下放着,引用方式如下

    <script src="/static/jquery-3.3.1.js"></script>

    前面的static是setting.py文件里STATIC_URL的值

    STATIC_URL = '/static/'  # HTML中使用的静态文件夹前缀

    但是如果有一天,我们需要把STATIC_URL 的值换一个,比如换成staticfile,这时候就要把所有引用到的都要改成staticfile

    我们可以使用 {% load static %} 来引用静态文件,这时不管你静态文件改为什么都不用改其他地方的代码

    先来看下没修改之前的

    <!-- Bootstrap core CSS -->
    <link href="/static/bootstrap-3.3.7/css/bootstrap.css" rel="stylesheet">

    <!-- 当前页面用到的自定义样式 -->
    <link href="/static/dashboard.css" rel="stylesheet">

    <script src="/static/jquery-3.3.1.js"></script> <script src="/static/bootstrap-3.3.7/js/bootstrap.js"></script>

    改之后,字符串里最开始不需要/,django会帮我们拼接,这样,我们随便改STATIC_URL 的值,都不需要改静态文件的导入地址

    <!-- Bootstrap core CSS -->
    <link href="{% static 'bootstrap-3.3.7/css/bootstrap.css' %}" rel="stylesheet">

    <!-- 当前页面用到的自定义样式 --> <link href="{% static 'dashboard.css' %}" rel="stylesheet">

    <script src="{% static 'jquery-3.3.1.js' %}"></script> <script src="{% static 'bootstrap-3.3.7/js/bootstrap.js' %}"></script>

    某个文件多处被用到可以存为一个变量

    {% load static %}
    {% static "images/hi.jpg" as myphoto %}
    <img src="{{ myphoto }}"></img>
    get_static_prefix

     先在html文件里 加上下面两句代码,看是什么

    {% load static %}
    {% get_static_prefix %}

    用开发者工具查看结果,

    /staticfile/

    结果就是setting.py里的STATIC_URL 的值,这样的话,上面的代码我们就可以写成

    <!-- Bootstrap core CSS -->
    <link href="{% get_static_prefix %}bootstrap-3.3.7/css/bootstrap.css" rel="stylesheet">

    <!-- 当前页面用到的自定义样式 --> <link href="{% get_static_prefix %}dashboard.css" rel="stylesheet">

    <script src="{% get_static_prefix %}jquery-3.3.1.js"></script> <script src="{% get_static_prefix %}bootstrap-3.3.7/js/bootstrap.js"></script>

    两种方法效果都是一样的,第一种方法是Django帮我们拼接,第二种方法是我们自己拼接

    simpletag

    和自定义filter类似,filter最多只能有两个参数,而且一个还是变量。而filter可以接受更灵活的参数

    from django import template
    
    register = template.Library()  # 固定写法,生成一个注册实例对象
    
    @register.simple_tag()
    def join_str(*args, **kwargs):
        return '-'.join(args)

    在html里使用自定义的simple tag

    {% load  add_str%}  <!-- add_str为templatetags包下的py文件名 -->

    <!-- 使用里面的join_str函数,后面的都是参数 --> <p>{% join_str 'zou' 'is' 'IT' k1='job' k2='bob' %}</p>

    这样页面上的展示效果为:

    <p>zou-is-IT</p>

    inclusion_tag

    用于返回一些HTML代码段,返回的是字典格式的

    在templatetags创建一个my_inclusion.py文件

    from django import template
    
    register = template.Library()
    
    
    @register.inclusion_tag('page.html')  # 需要传一个文件名
    def page(total, current_num):
        return {'total': range(1, total + 1), 'current_num': current_num}

    page.html

    {% for num in total %}
          {% if num == current_num %}
                <li class="active"><a href="#">{{ num }}</a></li>
          {% else %}
                <li><a href="#">{{ num }}</a></li>
          {% endif %}
    {% endfor %}

    最后在html页面里引用page函数

    {% load my_inclusion %}  导入的py文件名
    {% page 6 3 %}

    代码解释:

    定义了一个page函数,它接受两个参数,上面的装饰器需要一个参数文件名,返回的是一个字典,在页面中导入了这个函数,传了两个参数,一个为6,一个为3,page拿到这两个参数后,传给了page.html进行渲染。因为6在page里使用了range,然后再循环,结果就是1....6,在进行判断。渲染完之后返回了一个页面,来看个图加深一下理解

    总结:

    csrf_token

      1. 放在form表单中

      2. 在表单中添加了一个隐藏的input标签

      name csrfmiddlewaretoken

      valve askjdaskdhashdkasd      64位的字符串

    母版继承

      1. 定义一个母版 普通的HTML代码 base.html

      2. 在母版中定义block块

      3. 子页面中继承的母版 {% extends 'base.html' %}

      4. 重写block块 

      注意事项:
        1. {% extends 'base.html' %}写在第一行

        2. {% extends name %} name写继承的母版的名字字符串

        3. 自定义的内容写在block中

        4. 定义多个block块 一般要有js css

    组件

      1. 写一段的代码 nav.html

      2. {% include 'nav.html' %}

    静态文件相关
      1. {% load static %}

      2. {% static '相对路径' %} ——》 去settings中获取STATIC_URL '/static/' 和相对路径进行拼接

      3. {% get_static_prefix %} ——》 去settings中获取STATIC_URL '/static/'

      "{% get_static_prefix %}相对路径"

    自定义inclusion_tag

      1. 在app下创建一个templatetags的python包 templatetags名字不能错

      2. 在包下写py文件 mytags

      3. 编辑文件

        from django import template

        register = template.Library()

      4. 定义函数

        可以接受参数,返回一个字典

      5. 函数上加装饰器

        @register.inclusion_tag('page.html')

      6. 函数返回的字典 交给 xxx.html 渲染

  • 相关阅读:
    《ORANGE'S一个操作系统的实现》第7章 TTY与键盘输入的关系。
    《将博客搬至CSDN》
    x86汇编分页模式实验 --《ORANGE'S一个操作系统的实现》中 pmtest8.asm解析
    LR(1)语法分析器生成器(生成Action表和Goto表)java实现(二)
    LR(1)语法分析器生成器(生成Action表和Goto表)java实现(一)
    LeetCode 85. 冗余连接 II
    2397
    机器学习入门(九)之----logistic回归(牛顿法)
    机器学习入门(八)之----logistic回归(番外篇感知机算法)
    机器学习入门(七)之----logistic回归(回归函数与概率模型)
  • 原文地址:https://www.cnblogs.com/zouzou-busy/p/11181623.html
Copyright © 2011-2022 走看看